forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=108)
-   -   Реализация простой камеры. (http://forum.boolean.name/showthread.php?t=5025)

Данил 14.11.2007 19:29

Реализация простой камеры.
 
Решил я попытатся написать че-нить на OpenGL. OpenGL рулит.
Уже сделал несколько функций по работе с объектами (MoveEntity , RotateEntity , TurnEntity, translateEntity .. в обще б3д ^_^) . И сами объккты (пока кубики) .

Вот уже сколько читаю на сайтах.... везде про какие-то кватернионы...
как-то там сложно написано.. моему моску это не понять ^_^
объясните, как нормльно на бмаксе сделать камеру... вот не понимаю...

И пример со свободным полетом и управлением с мыши... плиз...

alcoSHoLiK 14.11.2007 19:34

Re: Реализация простой камеры.
 
Так тебе камеру нормально сделать или кватернионы объяснить?
Кватернионы отлично объяснены тут http://www.gamedev.ru/users/wat/articles/quaternions

Данил 14.11.2007 19:35

И то и то ;)

Я сделал перемещение.. то есть ко всем координатам объектов я прибавлял х камеры... и так же к у... он я 100% уверен, что неправильно...

И как сделать обзор? о_О

Посмотрел я его.... вообще текстурить-то можно?
Кто-нибудь пользовался OpenGL через BlitzMax ?)

Сколько вопросов...

Pixel 14.11.2007 23:53

Re: Реализация простой камеры.
 
http://perso.club-internet.fr/gilles...e_Tutorial.zip - уроки от NeHe для BlitzMax ;)

Данил 14.11.2007 23:56

Re: Реализация простой камеры.
 
ээ.. надеюсь, это не те, что идут вместе с bmax...

сейчас скачаю... посмотрю...

jimon 15.11.2007 00:10

Re: Реализация простой камеры.
 
матрицы спасут мир ... ;)

Данил 15.11.2007 00:31

Re: Реализация простой камеры.
 
Скачал. Посмотрел.
Что эт? Во-первых ,требует какой-то модуль

Framework brl.blitzgl
Import brl.system

Пошарился - нигде нет.
Во-вторых, чтобы запустить, приходится менять многопараметров... а порой вообще не запускается...
К примеру:
bglCreateContext(ScreenWidth,ScreenHeight,ScreenDe pth,0,BGL_BACKBUFFER | BGL_DEPTHBUFFER)
GLGraphics(ScreenWidth,ScreenHeight,ScreenDepth,0, BGL_BACKBUFFER | BGL_DEPTHBUFFER)

bglSetMouseVisible False вообще надо убирать....

bglDrawText("Nehe lesson 5",10,24)
GLDrawText("Nehe lesson 5",10,24)

Это в первых примерах. А далее там уже через каждые 5 строчек надо что-то менять.. но поменять не получится... так как хз на что =)))

Зато в начальных уроках текстуру учат накладывать. Сейчас прочту, и наложу текстуру ! :crazy:

Pixel 15.11.2007 00:59

Re: Реализация простой камеры.
 
ХЗ, примеры наверное для какой-то ветхой версии BM, но несмотря на ето в них много полезного ;)

Данил 15.11.2007 01:00

Re: Реализация простой камеры.
 
Посмотрел все примеры. Удалось исправить 70% примерно.. гы, а так ни че.. и тени есть, и физика... мну нравтся ^_^
Осталось осмыслить все это =)))

Pixel 15.11.2007 01:14

Re: Реализация простой камеры.
 
Когда исправиш все выложи пожалуйста архивчик :)

Или там токо нужно приставку bgl менят на gl ?

XenuS 15.11.2007 09:28

Re: Реализация простой камеры.
 
эээ, а как ты сделал moveEntity? можешь кинуть, если не сложно=)))) а то я чего-то перепробовал все, что только можно, но двигается он не правильно в двиге....

Данил 15.11.2007 12:53

Re: Реализация простой камеры.
 
Function MoveEntity (cube:TypeCube, x:Float,y:Float,z:Float)
Cube.X:+x/
Cube.Y:+y/
Cube.Z:+z/
End Function

ВотЪ ))) Cube.X=Cube.X+1
Есть объект. У каждого объекта свой x,y,z . Когда вызываем функцию MoveEntity, прибавляем к x объекту значение.. все просто ;)

Вот туториал : http://www.rapidshara.ru/17476

Я его передал... что смог, то и переделал...
Не работают :
13
17
28
32
33
34
39
41
...

Function SortArrayType(This:objects Ptr, level:Int
Function LoadTGA(Tex:textures Ptr, filename:String)
base=bglFixedFontBitmaps()
Local extensions:String=glGetString(GL_EXTENSIONS)

Вон на этих строчках.. че за Ptr ? он на них в несколькх примерах загибался...

dimanche13 15.11.2007 13:04

Re: Реализация простой камеры.
 
ptr - указатель

XenuS 15.11.2007 14:48

Re: Реализация простой камеры.
 
сорри за оффтоп, но по-моему же это не будет работать, если объект под углом расположен? допустим, у объекта угол по питчу=30....значит, если мы напишем MoveEntity(cube,0,0,1), то он переместиться должен не только по Z но и по Y....или я не прав?

Данил 15.11.2007 15:23

Re: Реализация простой камеры.
 
о_О

незнаю, мож у тя не так, я использую
glTranslatef x,y,z
glRotatef RotateSpeed,RotateX,RotateY,RotateZ

У меня все норм О_О даже если объект повернут....

XenuS 15.11.2007 15:57

Re: Реализация простой камеры.
 
ок, буду искать ошибку....спс))

Данил 16.11.2007 01:02

Re: Реализация простой камеры.
 
Ура! Я сделал управление с клавы и мыши! Терь все как положено...

Теперь надо понять текстурирование...

Данил 17.11.2007 15:03

Re: Реализация простой камеры.
 
Гы. оказывается, сделал я неправильно. Я, так сказать, крутил весь с мир, а сама камеры была на месте...

Это оказывается неправильно...

Правильно - это применять gluLookAt() ... но какие параметры и че - хз...
Вот, кстати, нашел инфу об этой функции:
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 5 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.


Мож кому-то понадобится...

jimon 17.11.2007 19:52

Re: Реализация простой камеры.
 
Данил
ну там 9 параметров
3 параметра ето x,y,z точки где стоит камера
3 параметра ето x,y,z точки куда смотрит камера
3 параметра ето x,y,z куда смотрит "верх" камеры
ну типа чтобы камеру можно было вращать вокруг своей оси
которая проходит через центр обьектива

Данил 17.11.2007 20:07

Re: Реализация простой камеры.
 
Ну я вроде как разобрался уже...
Разницы не заметил между отдельными функциями, и этим глуком gluLookAt ...

Хех...
Никто не знает, как повернуть объект вокруг себя?
Есил поворасчивать вначале цикла, а потом по глобальным координатам переставлять - параша получается.
Если вначалае переместить по глобальным координатам, а затем вертим, то объект поворачивается не вокруг своей оси, а вокруг 0, то есть по большому радиусу...

Пытался методом тыка - не получилось...

Код:

Method Draw()
Local xtrans:Float, ztrans:Float
Local scenerotX:Float, scenerotY:Float

'Вычеляем мировые координаты поворота.
scenerotX = 360.0 - CameraRX
scenerotY = 360.0 - CameraRY
       
'координаты мировые пооложения в простарнстве
xtrans=-CameraX
ztrans=-CameraZ


glLoadIdentity

' Перемещаем по мировым координатам.
glRotatef -scenerotY, 1,0,0
glRotatef scenerotX, 0,1,0       
glTranslatef xtrans, 0, ztrans

'Рисуем...
glBegin GL_QUADS       
        For Local i = 0  To VerteCol
       
        glColor3f  0.9, 0.2, 0.15
        glVertex3f  VertexX[i], VertexY[i],VertexZ[i]         
        Next
glEnd
End Method
End Type



glRotated RotateSpeed, RotateX,RotateY,RotateZ
А вот он мега аццкий код , вертящий объект...
Но вот как его вокруг своей оси - хз...

Вариант 1.

При вызове функции поворота мы поворачиваем объект и как-нибудь записываем текущие координаты

вариант 2.

Вначале перемещаем и крутим объект. Потом закрепляем как-нибудь. И уже сново поворачиваем, но уже вокруг своей оси...



вот... как именно - я хз...

HolyDel 17.11.2007 23:31

Re: Реализация простой камеры.
 
сначала перемещаем, потом крутим. вот кусок кода:

Код:

        glPushMatrix();
                                glTranslatef(x,y,z);

                                if(parent!=NULL)
                                {
                                        if(parent->sx!=1.0f||
                                                parent->sy!=1.0f||
                                                parent->sz!=1.0f)
                                        {
                                                glScalef(1.0f/parent->sx,1.0f/parent->sy,1.0f/parent->sz);
                                        }
                                }

                                glRotatef(az,0,0,1);
                                glRotatef(ay,0,1,0);
                                glRotatef(ax,1,0,0);
/*
                                if(parent!=NULL)
                                {
                                        if(parent->sx!=1.0f||
                                                parent->sy!=1.0f||
                                                parent->sz!=1.0f)
                                        {
                                                glScalef(parent->sx,parent->sy,parent->sz);
                                        }
                                }
*/
                                if(sx!=1.0f||sy!=1.0f||sz!=1.0f)
                                glScalef(sx,sy,sz);


Данил 18.11.2007 00:00

Re: Реализация простой камеры.
 
Ура! наконец-то я сделал! HolyDel, спасиб те.

// Перемещаем относительно камеры
glRotatef -scenerotY, 1,0,0
glRotatef scenerotX, 0,1,0
glTranslatef xtrans, 0, ztrans

//Перемещаем относительно своих координат!
glTranslatef x, y, z
glRotated RotateSpeed, RotateX,RotateY,RotateZ

Ура! Сейчас текстурами займусь...

HolyDel 18.11.2007 02:20

Re: Реализация простой камеры.
 
начало координат ВСЕГДА в камере. твой драгоценный gluLookAt ничо другого не делает кроме как перемещает и поворачивает МИР.

Цитата:

// Перемещаем относительно камеры
glRotatef -scenerotY, 1,0,0
glRotatef scenerotX, 0,1,0
glTranslatef xtrans, 0, ztrans

//Перемещаем относительно своих координат!
glTranslatef x, y, z
glRotated RotateSpeed, RotateX,RotateY,RotateZ
вообще то нет. умножение матриц не коммутативно (т.е. AxB != BxA), это должно быть всем известно с институтской скамьи.
Если ты сначала повернеш мир, а потом его переместиш, то он у тебя переместится в другую точку (мир то уже перевернут).
а вот если ты его сначала переместиш а потом перевернеш, то он переместится туда, куда тебе надо.


Часовой пояс GMT +4, время: 20:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot