Вращение камеры по окружности

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Вращение камеры по окружности

Сообщение ChemistN1 » 20.04.2006 (Чт) 20:57

Искал-искал в Поиске, так и не нашел...
У меня есть 3 переменные - радиус-вектор, угол альфа и угол бета, как мне с их помощью повернуть камеру на заданном радиус-вектором расстоянии от начала координат? То есть при движении камера описывает окружность, двигаясь по поверхности шара и смотрит все время на начало координат.
VB6 forever!

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 20.04.2006 (Чт) 21:22

угол альфа замени на угол дельту, а бету на гамму и фсе будит ништяк.

а если серьезно, то ты хотя бы написал, что это за углы у тебя такие волшебные...
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 20.04.2006 (Чт) 21:32

Насколько я понял он хочет сделать что-то типа вращение вокруг модели только в качестве моделе начало координат! Если так то подскажу!
#define ROFL 0xDDDD

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Сообщение ChemistN1 » 21.04.2006 (Пт) 6:38

В общем мне надо, чтоб камера вращалась вокруг глобуса на фиксированной высоте. ДиректХ8, ВБ6.

то ты хотя бы написал, что это за углы у тебя такие волшебные...

Положение точки на поверхности шара задается любыми 2-мя величинами. Допустим угол альфа - от -90 до 90градусов - угол между началом координат, экватором и камерой, а бетта (от 0 до 360 градусов) - угол между началом координат, нулевым меридианом и камерой.

Насколько я понял он хочет сделать что-то типа вращение вокруг модели только в качестве моделе начало координат! Если так то подскажу!

Вот-вот, это мне и надо!
VB6 forever!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 21.04.2006 (Пт) 19:02

ChemistN1
a - меридиан
b - параллель

x=sin(a)*cos(b)
z=cos(a)*cos(b)
y=sin(b)
MatrixLooAtLH Vec3(x,y,z),vec3(0,0,0),vec3(0,1,0)

На северном и южном полюсе будет неопределен вектор вверх.

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Сообщение ChemistN1 » 22.04.2006 (Сб) 8:47

Сделал, работает, только проблема не решена: как источник света вместе с камерой поворачивался, так и поворачивается.

Может здесь ошибка:

Код: Выделить всё
A = ViewerXY
B = ViewerXZ
Xq = Sin(A) * Cos(B)
Zq = Cos(A) * Cos(B)
Yq = Sin(B)
D3DXMATH_MATRIX.D3DXMatrixLookAtLH matWorld, Vec3(Xq, Yq, Zq), Vec3(0, 0, 0), Vec3(0, 1, 0)
g_D3DDevice.SetTransform D3DTS_WORLD, matWorld
D3DXMatrixPerspectiveFovLH matProj, 1, 1, 1, 200
g_D3DDevice.SetTransform D3DTS_PROJECTION, matProj


Или здесь:

Код: Выделить всё
Dim col As D3DCOLORVALUE
Dim mtrl As D3DMATERIAL8
With col:    .r = 1: .g = 1: .B = 0: .A = 1:   End With
mtrl.diffuse = col
mtrl.Ambient = col
g_D3DDevice.SetMaterial mtrl
Dim light As D3DLIGHT8
light.Type = D3DLIGHT_DIRECTIONAL
light.diffuse.r = 1
light.diffuse.g = 1
light.diffuse.B = 1
light.Direction.X = Sin((-720 + HourInt * 60 + MinuteInt + SecondInt / 60) / 720 * g_pi)
light.Direction.Y = 0
light.Direction.Z = Cos((-720 + HourInt * 60 + MinuteInt + SecondInt / 60) / 720 * g_pi)
light.Range = 1000
g_D3DDevice.SetLight 0, light
g_D3DDevice.LightEnable 0, 1
g_D3DDevice.SetRenderState D3DRS_AMBIENT, &H202020
g_D3DDevice.SetRenderState D3DRS_LIGHTING, 1


Хотя не знаю, вроде все правильно. До этого я весь мир крутил, поэтому свет освещал глобус фиксированно, на какое место не посмотришь. При вращении камеры вокруг глобуса тень должна оставаться на месте, а она вращается вместе с камерой. Блин, не знаю.[/code]
VB6 forever!

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Сообщение ChemistN1 » 22.04.2006 (Сб) 12:41

Понял, где ошибка только понятия не имею, как ее исправить.

Код: Выделить всё
D3DXMATH_MATRIX.D3DXMatrixLookAtLH matWorld, Vec3(Xq, Yq, 25), Vec3(0, 0, 0), Vec3(0, 1, 0)
g_D3DDevice.SetTransform D3DTS_VIEW, matWorld

Здесь тень вращается вместе с глобусом, зато глобус вместо вращения колеблется. Блин.
VB6 forever!

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Сообщение ChemistN1 » 22.04.2006 (Сб) 14:25

Все, разобрался, ура! А объект какой командой вращать не подскажете? (сразу говорю, в поиске не нашел)
VB6 forever!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 22.04.2006 (Сб) 15:21

ChemistN1
Что бы вращать объект - изменяй матрицу World , а не View. Только изменения должны быть противоположные.

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Сообщение ChemistN1 » 22.04.2006 (Сб) 15:26

У меня world'ом все объекты одновременно вращаются. А мне один надо. Блин, после Dark Basicа ощущаю себя полным тупицей.
VB6 forever!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 22.04.2006 (Сб) 17:53

ChemistN1
Перед рендером каждого объекта устанавливаешь свой World.

ChemistN1
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 11
Зарегистрирован: 16.04.2006 (Вс) 11:39

Сообщение ChemistN1 » 22.04.2006 (Сб) 19:22

Все перепробовал, но что делать не понял. Рендерю по отдельности - все мерцает (ну это понятно от чего), задаю world до нужного объекта - ничего не меняется, вращаю во время рендеринга - все равно вращается весь мир. Подскажите, что я не так делаю и как надо.
VB6 forever!


Вернуться в Мультимедиа

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

    TopList