Математика вращения камеры вокруг объекта в DirectX8.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Математика вращения камеры вокруг объекта в DirectX8.

Сообщение Glyckmen » 09.07.2006 (Вс) 12:56

Добрый день. Мой вопрос больше не по программированию, а по математике. Решил изучить принципы работы с DirectX8. По инету нашел кое-чего, хотя этот вопрос ОЧЕНЬ мало освещен на рускоязычных сайтах (английский для меня темнота), сделал свою маленькую прогу (выводит маленького робота из готового X файла и натягивает текстуру), захотелось сделать свободное вращение вогруг объекта с помощью мыши или кнопок, сначала начал вращать сам мир (D3DXMatrixRotationQuaternion) появились искажения при определенных углах, решил матрицу мира оставить в покое и вращать камеру (после того как разобрался с ней)
Код: Выделить всё
D3DXMatrixLookAtLH matView, vec3(x3dx, y3dx, z3dx), vec3(0, 0, 0),vec3(0, vector, 0)
, сделал обработчик событий клавы и мыши и начал изменять положение камеры и вот тут возникли БОЛШИЕ проблемы с математикой, описать вращение по одной оси (по X при Y=0 или по Y при X=0) я еще смог, но как только я пытаюсь сделать вращение когда X<>0 и Y<>0 , то тут и появляются проблемы, дошел до того что мне надо вычислять координаты точки (X,Y,Z) на поверхности "объемного шара" (в центре "шара" и находится объект, камера всегда направлена на центр "шара") с постоянным радиусом, в начальной стадии я знаю координаты всех точек, вот и нужна формула при изменении Y при X<>0 получить новые координаты X и Z (c X при Y<>0 более и менее понятно там только новый радиус отсеченной плоскости на высоте Y, по этому радиусу и вращаться, а расстояние до центра "шара" остается неизменным )
Мой код просчета координат:
Код: Выделить всё
Private Sub Form_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then 'Нажали ENTER и вернули все на место
        nx = 0
        ny = 0
        nz = 6
        vec = 1
    End If
    If KeyAscii = 27 Then en = True ' Нажали ESC и вышли
    If ny1 = 63 Or ny1 = -63 Then ny1 = 0 ' Если сделали оборот на 360
    If nx1 = 63 Or nx1 = -63 Then nx1 = 0 ' то ставим в "0"
    If KeyAscii = 119 Then ' Нажали клавишу "w" (вверх)
        ny1 = ny1 + 1
        ny = Sin(ny1 / 10) * 6 'Вычисляем координаты(6- радиус)
        nz = Cos(ny1 / 10) * 6
   
        ' В нужный момент меняем вектор верха камеры что-бы изображение не прыгало
        If (ny1 > -16 And ny1 < 15) Or (ny1 > 47 And ny1 > -47) Then vec = 1
        If (ny1 > 15 And ny1 < 48) Or (ny1 > -48 And ny1 < -15) Then vec = -1
    End If

    If KeyAscii = 115 Then ' Нажали клавишу "s" (вниз)
        ny1 = ny1 - 1
        ny = Sin(ny1 / 10) * 6
        nz = Cos(ny1 / 10) * 6
         ' В нужный момент меняем вектор верха камеры что-бы изображение не прыгало
        If (ny1 > -47 And ny1 < 16) Or (ny1 > 47 And ny1 > -47) Or (ny1 < -47) Then vec = 1
        If (ny1 > 15 And ny1 < 48) Or (ny1 > -48 And ny1 < -15) Then vec = -1
    End If

    If KeyAscii = 100 Then ' Нажали клавишу "d" (вправо)
        nx1 = nx1 + 1
        nx = Sin(nx1 / 10) * 6
        nz = Cos(nx1 / 10) * 6
    End If

    If KeyAscii = 97 Then ' Нажали клавишу "a" (влево)
        nx1 = nx1 - 1
        nx = Sin(nx1 / 10) * 6
        nz = Cos(nx1 / 10) * 6
    End If
    Debug.Print ny1; nx1; vec
End Sub

Public Sub Render()
Dim i As Long

g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF&, 1, 0

' Начало сцены
g_D3DDevice.BeginScene

SetupMatrices nx, ny, nz, vec

' 3d объекты разделенына части (subsets).
' У каждой части свой материал и текстура.
' Рендеринг 3d объекта по частям в цикле:
For i = 0 To g_NumMaterials - 1
    g_D3DDevice.SetMaterial g_MeshMaterials(i)
    g_D3DDevice.SetTexture 0, g_MeshTextures(i)
    g_Mesh.DrawSubset i
Next

' Конец сцены
g_D3DDevice.EndScene

g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub



Может кто решал эту задачу, помогите пожалйста.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.07.2006 (Вс) 18:55

Итак формула для определения VECTOR3D для любой точки шара в зависимости от углов Эйлера.

(Ну пусть у нас есть паралель и меридиан.)
Код: Выделить всё
x = Radius * (Cos(Parallel) * Cos(Meridian))
y = Radius * (Cos(Parallel) * Sin(Meridian))
z = Radius * (Sin(Parallel))


Доволен?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 10.07.2006 (Пн) 19:05

http://pmg.org.ru/basic3d/index.html
по-моему лучший сайт на русском языке по 3D

есть статьи по OpenGL, по DirectX и вообще по понятию 3D
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 20

    TopList