Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2014, 11:33   #1
Useroid
 
Аватар для Useroid
 
Регистрация: 07.01.2014
Сообщений: 7
Радость Delphi и OpenGL - низкая дальность отрисовки

Всем привет!

Решил помучать себя и попробовал OpenGL. Попытался нарисовать куб. Маленький выглядел нормально, но если увеличить размер, скажем, в 3 раза, то половина куба, примерно в центре, будет вырезана.

Как избавиться от этой проблемы? Пробовал gluPerspective, не сработало.
Useroid вне форума Ответить с цитированием
Старый 07.01.2014, 17:25   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)не нужно заоблачных цифр, все относительно.
2)попробуйте более простые функции, по типу glOrtho
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.01.2014, 17:42   #3
Useroid
 
Аватар для Useroid
 
Регистрация: 07.01.2014
Сообщений: 7
По умолчанию

Пепел Феникса, glOrtho тоже не сработал
Useroid вне форума Ответить с цитированием
Старый 07.01.2014, 17:57   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

выложите код, пожалуйста.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.01.2014, 22:35   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вы лучше картинку покажите, так нагляднее. Могу предположить, что отсекаются плоскости вашего куба, т.к. они выходят за границы сцены. Представьте на секунду 3D-пространство внутри монитора. Представили? Хорошо. Теперь представьте невидимый квадратный туннель в перспективе. А теперь представьте, что внутри туннеля построили 2 стены (ближнюю и дальнюю), что получился невидимый куб (Сцена). И от вас зависит где именно строить стены. А отвечает за это функция glFrustum. Ваш объект может быть не на весть экран, но передняя плоскость отсечения может по координатам пересекаться с ним. Вот отсюда и обгрызанный кусок.
Скорей всего вам поможет такой вот кусок кода:
Код:
procedure resize_app;
var w, h, fLength, fInvLength: real;
begin
 glMatrixMode(GL_PROJECTION);//
glLoadIdentity();//

w := Form1.width;
h := Form1.height;

    fLength := sqrt( w * w + h * h);

    if fLength > 0.00001 then
    begin
      fInvLength := 1.0 / fLength;
      w := w * fInvLength;
      h := h * fInvLength;
    end;

w := w / 2;
h := h / 2;

glFrustum(-w, w, -h, h, 1, 100);
glTranslated(0, 0, -10);

glViewPort(0,0,Form1.width,Form1.Height);
  InvalidateRect(Handle, nil, False);
end;
Вызывайте его при изменении размеров формы.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 10.01.2014, 10:31   #6
Useroid
 
Аватар для Useroid
 
Регистрация: 07.01.2014
Сообщений: 7
По умолчанию

Пепел Феникса, во вложении кусок исходника, там сама отрисовка и функция DrawCube.

scw=screen.Width
sch=screen.Height

Rin, скрин выложить не могу, но могу описать как все происходит. Устанавливаю синий фон, куб красный. Если длина грани - 100, то куб отрисовывается без ошибок, а если длина грани - 200 или 300, то, как я понял, часть куба заходит за границу и просто не отображается. Поэтому возникает вопрос, как отдалить эти границы, чтобы куб даже при размере 500 отрисовывался нормально?

Код, если и поможет, добавлю в OnFormCreate, т.к. форма устанавливается на весь экран.
Вложения
Тип файла: txt txt.txt (2.1 Кб, 135 просмотров)

Последний раз редактировалось Useroid; 10.01.2014 в 16:33.
Useroid вне форума Ответить с цитированием
Старый 11.01.2014, 09:06   #7
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

А зачем вообще устанавливать параметр в 500? Чего вы хотите добиться?
Думаю ,что не лишним будет прочесть главу из книги Краснова. По коду могу сказать, что glFrontFace(), glEnable(),glMaterialFv(),glColorMa terial() и glLightFv(), если в процессе не меняете параметры освещения, цвета, и не вЫключаете то, что включили, лучше закидывать в FormCreate, чтобы не вызывалось при каждом RefrashForm, т.к. впустую отрабатывает мильён раз.
Ваш код не могу воспроизвести на данный момент, т.к. delphi не инсталирована.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 11.01.2014, 18:26   #8
Useroid
 
Аватар для Useroid
 
Регистрация: 07.01.2014
Сообщений: 7
По умолчанию

Rin, за ссылку спасибо. Размер 500 устанавливаю как пример того, что сцена ничтожно мала, а хотелось бы побольше. Кстати, 500 - это проценты, если что

В OnFormCreate пытался все написать, но вместо этого выдавалось чистое, белое поле.
Useroid вне форума Ответить с цитированием
Старый 12.01.2014, 04:42   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Когда читал Краснова, то из его исходников сделал себе трафарет. Он во вложении. 500 мы воспринимать можем и как проценты, а для OpenGL 500 в данном случае - это координаты. Если вы отрисовываете лишь один объект или хотите поменять масштаб всей сцены, то есть замечательная функция glScale(x,y,z). Я всегда все настройки сцены описывал в onCreate, и всегда все отрисовывалось.
Есть ещё более интересная книга про OpenGL - "Red Book OpenGL". Только она для С++.
Вложения
Тип файла: txt ТРАФАРЕТ.txt (7.1 Кб, 133 просмотров)
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 12.01.2014 в 04:47.
Rin вне форума Ответить с цитированием
Старый 13.01.2014, 09:29   #10
Useroid
 
Аватар для Useroid
 
Регистрация: 07.01.2014
Сообщений: 7
По умолчанию

Ну, я из книг читал "OpenGL Суперкнига" Райт-мл и Липчак. Она тоже на C++, но переписать данные там строки кода под Delphi было достаточно просто.

Насчет OnCreate, ну, т.к. в OpenGL я знаю очень мало, то для того, чтобы рисовать на TPanel, я использовал один движок, а точнее команду инициализации. Так что, вполне может быть, что OnCreate не работает именно из-за этой команды.

Насчет glScale(x,y,z), от этого придется уменьшать размеры объектов?
Useroid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Низкая скорость Интернета 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