purebasic.info

PureBasic forum
Текущее время: Пн июн 18, 2018 3:23 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Сб май 03, 2014 10:49 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт апр 29, 2014 8:26 am
Сообщений: 66
Благодарил (а): 50 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Задача такая: Поместить камеру в центр 3D примитива (Entity), и жестко закрепить её за координатами Entity, и за его направлением в пространстве. Цель: Управлять объектом в пространстве - перемещение, вращение - для вида сцены из этого объекта. Хочу сделать это для того, что-бы получить камере все доступные свойства и методы Entity, например: ApplyEntityImpulse(#Entity, x, y, z [, PositionX, PositionY, PositionZ]); ApplyEntityForce(#Entity, x, y, z [, PositionX, PositionY, PositionZ]) и другие, а так-же получить гравитацию, столкновения..., для управления камерой откроются новые возможности...
Я думал это просто будет, а оказалось - запутался напрочь в направлениях! Начинал я так:
Допустим, у меня есть Camera 0 и Entity 1, тогда

MoveCamera(0,EntityX(1), EntityY(1), EntityZ(1), #PB_Absolute) ;-ставит камеру в центр объекта.
Да, это прекрасно работает! Но теперь, пробую вращать объект, и начинается... сперва пробовал так:

RotateCamera(0,EntityPitch(1), EntityYaw(1), EntityRoll(1)) ;-но эти Pitch, Yaw, Roll возвращают значения в диапазоне (-180, +180), а для RotateCamera нужно (0, 359 градусов). Казалось-бы, при отрицательных значениях Pitch, Yaw, Roll просто добавить +360 и выйдем в (0, 359). Но нет, ничего подобного!... Потом я обнаружил, что вращение камеры, отличается от вращения Entity. Вращая камеру, например относительно одной оси, значение двух остальных - остаётся неизменным. А вот Entity так красиво вращаться не желает - начиная его вращать немного по одной оси, немного по другой - начинают от изменения одного значения меняться два остальных. Получается он вращается не локально, а оси его вращения всегда параллельны мировым осям. И всякие там изменения режима на #PB_Local #PB_World - результата не дают. Ну хорошо, оставил в покое команды Pitch, Yaw, Roll, и начал искать подобное, например: CameraDirection(#Camera, x, y, z) и три её возврата: Result = CameraDirectionX(#Camera); ...Y; ...Z. С ними тоже не пошло! Потом обнадёжила - FetchOrientation(ObjectID), но всё-бы хорошо, да только с CameraID она отказывалась работать!....
Возможна и обратная задача - синхронизировать Объект по Камере. Это тоже нужно. Но сути это не меняет.

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

_________________
PureBasic 5.40 LTS Windows x86 x64


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 03, 2014 10:54 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11178
Благодарил (а): 4 раз.
Поблагодарили: 414 раз.
Случайно CameraFollow не подойдет?
Пример в "Examples\3D\CameraFollow.pb". На первый взгляд то что нужно.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс май 04, 2014 5:03 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Цитата:
RotateCamera(0,EntityPitch(1), EntityYaw(1), EntityRoll(1))

А зачем так замудренно? На какие углы поворачиваешь объект на такие поворачивай и камеру.
В EntityRoll и прочих там флаги разные (#False по-моему надо использовать).

А угол -180..180 можно так в 0..360 переводить:
If a<0: a=(180+a)+180: EndIf
(формула навскидку)

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс май 04, 2014 10:57 am 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
AttachNodeObject (#Node, ObjectID, Type) - В помощь.
Эту проблему кстати, встречал во многих других движках.

Правда в других движках было типа EntityParent()

_________________
PureBasic 5.30(x86) | Windows 7 x64 Ultimate | 6г озу | NVIDIA GeForce GTX 650 1024 Мб


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт май 06, 2014 1:18 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт апр 29, 2014 8:26 am
Сообщений: 66
Благодарил (а): 50 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо за советы. Интересна команда AttachNodeObject (#Node, ObjectID, Type). По поводу слов AndyLy- ""А зачем так замудренно? На какие углы поворачиваешь объект на такие поворачивай и камеру"" - скажу или приведу пример, например, кинул я объект и он под действием физики упал, отскочил, попрыгал и успокоился. А камера находящаяся в нем всё это показала.... Ну и последнее, наиболее мощные и подходящие мне показались новые команды, которые мне показал Пётр в примере "Examples\3D\CameraFollow.pb". А именно это новая команда Yaw(ObjectID, Value, Mode) и новая команда CameraFollow(#Camera, ObjectID, Angle, Height, Distance, RotationPercent, PositionPercent [, Mode]). Я про них не знал, так-как пользуюсь версией 5.11, в которой ещё их нет. А скачав и установив PureBasic 5.22 LTS Demo!!! естественно(((, в ней их и нашел. Жаль конечно, что все мои попытки найти где то в инете версии больше 5.11, ни к чему ни приводят. Неужели, что-бы стать счастливчиком, нужно только покупать?

Вот главный цикл из примера CameraFollow.pb:

Цитата:
Repeat
Screen3DEvents()

If ExamineMouse()
MouseX = -MouseDeltaX() * #CameraSpeed * 0.03
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
EndIf

If ExamineKeyboard()

If KeyboardPushed(#PB_Key_Left)
KeyX = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Right)
KeyX = #CameraSpeed
Else
KeyX * 0.85
EndIf

If KeyboardPushed(#PB_Key_Up)
KeyY = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY = #CameraSpeed
Else
KeyY * 0.9
EndIf

EndIf

MoveEntity(Ninja, KeyX, 0, KeyY, #PB_Local) ; Это
Yaw(EntityID(Ninja), MouseX, #PB_World) ; Как раз
CameraFollow(Camera, EntityID(Ninja), 0, EntityY(Ninja) + 80, 160, 0.1, 0.1, #False) ; то что
CameraLookAt(Camera, EntityX(Ninja), 40, EntityZ(Ninja)) ; нужно!

RenderWorld()
Screen3DStats()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

_________________
PureBasic 5.40 LTS Windows x86 x64


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 07, 2014 10:13 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт апр 29, 2014 8:26 am
Сообщений: 66
Благодарил (а): 50 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Народ, кто как понимает команды:

Pitch(ObjectID, Value, Mode)
Yaw(ObjectID, Value, Mode)
Roll(ObjectID, Value, Mode)

За какую ось вращения каждая отвечает, и как более дословно можно их перевести на русский язык?

_________________
PureBasic 5.40 LTS Windows x86 x64


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 08, 2014 11:26 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Цитата:
За какую ось вращения каждая отвечает

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Цитата:
как более дословно можно их перевести на русский язык

Наверное отсюда перекочевало
http://ru.wikipedia.org/wiki/%D0%A1%D0% ... 0%B0%D1%82

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB