|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.01.2014, 11:33 | #1 |
Регистрация: 07.01.2014
Сообщений: 7
|
Delphi и OpenGL - низкая дальность отрисовки
Всем привет!
Решил помучать себя и попробовал OpenGL. Попытался нарисовать куб. Маленький выглядел нормально, но если увеличить размер, скажем, в 3 раза, то половина куба, примерно в центре, будет вырезана. Как избавиться от этой проблемы? Пробовал gluPerspective, не сработало. |
07.01.2014, 17:25 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
1)не нужно заоблачных цифр, все относительно.
2)попробуйте более простые функции, по типу glOrtho Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
07.01.2014, 17:42 | #3 |
Регистрация: 07.01.2014
Сообщений: 7
|
Пепел Феникса, glOrtho тоже не сработал
|
07.01.2014, 17:57 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
выложите код, пожалуйста.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
07.01.2014, 22:35 | #5 |
Негодник
Форумчанин
Регистрация: 10.11.2009
Сообщений: 880
|
Вы лучше картинку покажите, так нагляднее. Могу предположить, что отсекаются плоскости вашего куба, т.к. они выходят за границы сцены. Представьте на секунду 3D-пространство внутри монитора. Представили? Хорошо. Теперь представьте невидимый квадратный туннель в перспективе. А теперь представьте, что внутри туннеля построили 2 стены (ближнюю и дальнюю), что получился невидимый куб (Сцена). И от вас зависит где именно строить стены. А отвечает за это функция glFrustum. Ваш объект может быть не на весть экран, но передняя плоскость отсечения может по координатам пересекаться с ним. Вот отсюда и обгрызанный кусок.
Скорей всего вам поможет такой вот кусок кода: Код:
Если помог, проси поставить минус. Будь оригинален!
|
10.01.2014, 10:31 | #6 |
Регистрация: 07.01.2014
Сообщений: 7
|
Пепел Феникса, во вложении кусок исходника, там сама отрисовка и функция DrawCube.
scw=screen.Width sch=screen.Height Rin, скрин выложить не могу, но могу описать как все происходит. Устанавливаю синий фон, куб красный. Если длина грани - 100, то куб отрисовывается без ошибок, а если длина грани - 200 или 300, то, как я понял, часть куба заходит за границу и просто не отображается. Поэтому возникает вопрос, как отдалить эти границы, чтобы куб даже при размере 500 отрисовывался нормально? Код, если и поможет, добавлю в OnFormCreate, т.к. форма устанавливается на весь экран. Последний раз редактировалось Useroid; 10.01.2014 в 16:33. |
11.01.2014, 09:06 | #7 |
Негодник
Форумчанин
Регистрация: 10.11.2009
Сообщений: 880
|
А зачем вообще устанавливать параметр в 500? Чего вы хотите добиться?
Думаю ,что не лишним будет прочесть главу из книги Краснова. По коду могу сказать, что glFrontFace(), glEnable(),glMaterialFv(),glColorMa terial() и glLightFv(), если в процессе не меняете параметры освещения, цвета, и не вЫключаете то, что включили, лучше закидывать в FormCreate, чтобы не вызывалось при каждом RefrashForm, т.к. впустую отрабатывает мильён раз. Ваш код не могу воспроизвести на данный момент, т.к. delphi не инсталирована.
Если помог, проси поставить минус. Будь оригинален!
|
11.01.2014, 18:26 | #8 |
Регистрация: 07.01.2014
Сообщений: 7
|
Rin, за ссылку спасибо. Размер 500 устанавливаю как пример того, что сцена ничтожно мала, а хотелось бы побольше. Кстати, 500 - это проценты, если что
В OnFormCreate пытался все написать, но вместо этого выдавалось чистое, белое поле. |
12.01.2014, 04:42 | #9 |
Негодник
Форумчанин
Регистрация: 10.11.2009
Сообщений: 880
|
Когда читал Краснова, то из его исходников сделал себе трафарет. Он во вложении. 500 мы воспринимать можем и как проценты, а для OpenGL 500 в данном случае - это координаты. Если вы отрисовываете лишь один объект или хотите поменять масштаб всей сцены, то есть замечательная функция glScale(x,y,z). Я всегда все настройки сцены описывал в onCreate, и всегда все отрисовывалось.
Есть ещё более интересная книга про OpenGL - "Red Book OpenGL". Только она для С++.
Если помог, проси поставить минус. Будь оригинален!
Последний раз редактировалось Rin; 12.01.2014 в 04:47. |
13.01.2014, 09:29 | #10 |
Регистрация: 07.01.2014
Сообщений: 7
|
Ну, я из книг читал "OpenGL Суперкнига" Райт-мл и Липчак. Она тоже на C++, но переписать данные там строки кода под Delphi было достаточно просто.
Насчет OnCreate, ну, т.к. в OpenGL я знаю очень мало, то для того, чтобы рисовать на TPanel, я использовал один движок, а точнее команду инициализации. Так что, вполне может быть, что OnCreate не работает именно из-за этой команды. Насчет glScale(x,y,z), от этого придется уменьшать размеры объектов? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Низкая скорость Интернета | Alex01rus | Компьютерное железо | 14 | 27.10.2011 09:40 |
низкая скорость копирования на внешний жд | little_greg | Компьютерное железо | 13 | 29.01.2011 05:09 |
скорость отрисовки примитивов в delphi (многа букав) | xrob | Помощь студентам | 0 | 19.10.2010 03:04 |
Изменение параметров отрисовки OpenGL | hotcooler17 | Мультимедиа в Delphi | 11 | 15.11.2009 13:01 |
Дальность чувствительности мыши. Глупый вопрос... | Mixasik | Компьютерное железо | 3 | 18.01.2009 16:02 |