|
3D-программирование Вопросы, касающиеся программирования 3D мира |
27.02.2010, 23:59
|
#1
|
Знающий
Регистрация: 29.05.2007
Сообщений: 227
Написано 126 полезных сообщений (для 312 пользователей)
|
райпик в физиксе
Здрасте! Кто знает, подскажите пожалуйста, как строить луч пика (враппер под блиц) по направлению камеры. Буду признателен. По моим домыслам это неосуществимо.
|
(Offline)
|
|
28.02.2010, 00:13
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: райпик в физиксе
;Разрешение
ScreenWidth = 800
ScreenHeight = 600
;Центр экрана
CenterX = ScreenWidth Shr 1
CenterY = ScreenHeight Shr 1
;Инициализация графики
Graphics3D(ScreenWidth, ScreenHeight, 32, 2)
SetBuffer(BackBuffer())
;Камера
Camera = CreateCamera()
;Принудительная установка угла фокуса камеры необходима чтобы проекция
;была корректной т.к. узнать его с помощью средств Блица невозможно
FOV = 85
Zoom# = 1.0 / Tan(FOV / 2)
CameraZoom(Camera, Zoom)
;Проекцируемый объект
Cube = CreateCube()
;Удаление объекта от камеры
Mz = 10
Repeat
;Вращаем и двигаем камеру чтобы убедиться в корректности проекции
TurnEntity(Camera, 0.5, 1.2, -2.1)
MoveEntity(Camera, 1.5, 0.05, 0.4)
;Получаем экранные координаты
Mx = MouseX()
My = MouseY()
;Изменяем координату "удаленности" объекта от камеры
Mz = Mz + MouseZSpeed()
;Проецируем экранные координаты в мировые
Px# = (Mx - CenterX) * Mz / Zoom / CenterX
Py# = (My - CenterY) * Mz / -Zoom / CenterX
;Умножаем координаты (вектор) на матрицу трансформации камеры
Wx# = GetMatElement(Camera, 0, 0) * Px + GetMatElement(Camera, 1, 0) * Py + GetMatElement(Camera, 2, 0) * Mz + GetMatElement(Camera, 3, 0)
Wy# = GetMatElement(Camera, 0, 1) * Px + GetMatElement(Camera, 1, 1) * Py + GetMatElement(Camera, 2, 1) * Mz + GetMatElement(Camera, 3, 1)
Wz# = GetMatElement(Camera, 0, 2) * Px + GetMatElement(Camera, 1, 2) * Py + GetMatElement(Camera, 2, 2) * Mz + GetMatElement(Camera, 3, 2)
;Позиционируем объект по полученым координатам
PositionEntity(Cube, Wx, Wy, Wz)
;Поворачиваем объект по углам поворота камеры чтобы убрать влияние ориентации камеры
;Для спрайта это не нужно, т.к. он по умолчанию поворачивается лицом к камере
RotateEntity(Cube, EntityPitch(Camera), EntityYaw(Camera), EntityRoll(Camera))
RenderWorld()
Flip()
Until KeyDown(1)
End
вот так переводишь 2д координаты в 3д, ставишь в это положение какой-нить пивот, затем находишь углы поворота этого пивота относительно камеры и поворачиваешь луч, вроде должно работать
|
(Offline)
|
|
Эти 9 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
|
|
28.02.2010, 09:56
|
#3
|
Знающий
Регистрация: 29.05.2007
Сообщений: 227
Написано 126 полезных сообщений (для 312 пользователей)
|
Ответ: райпик в физиксе
С физиксом не прокатит. Луч можно позиционировать и задать направление (pxRaySetDir), вектором. Вот не пойму как это сделать, чтоб луч поворачивал в нужную сторону.
|
(Offline)
|
|
28.02.2010, 10:10
|
#4
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: райпик в физиксе
Блин, H@non, ты что творишь!
насколько я помню, лучу надо подставить вектора направления по всем осям, а значит:
TFormVector 0,0,1,Camera,0
aX#=TFormedX#()
aY#=TFormedY#()
aZ#=TFormedZ#()
вот тебе и вектора направления
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.02.2010, 12:09
|
#5
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: райпик в физиксе
это подойдет если тебе нужно луч центровать ровно по центру экрана, а я показал случай когда нужно луч выстрелить в координаты мыши. Как только разместил пивот в переведенных из 2д в 3д координаты также через TformVector получаем вектор направления взгляда луча, и подставляешь значения для поворота луча. Потом накатаю пример, если уж сами не можете додумать код, может прояснит ситуацию.
|
(Offline)
|
|
28.02.2010, 13:56
|
#6
|
Знающий
Регистрация: 29.05.2007
Сообщений: 227
Написано 126 полезных сообщений (для 312 пользователей)
|
Ответ: райпик в физиксе
Павел, спасибо! Это то мне и надо было. Плохо, что сам не додумался
|
(Offline)
|
|
28.02.2010, 16:00
|
#7
|
Оператор ЭВМ
Регистрация: 02.11.2008
Сообщений: 27
Написано 12 полезных сообщений (для 24 пользователей)
|
Ответ: райпик в физиксе
Сообщение от H@NON
Как только разместил пивот в переведенных из 2д в 3д координаты также через TformVector получаем вектор направления взгляда луча, и подставляешь значения для поворота луча.
|
Да ты ж упоротый, в приведенном коде найти вектор - отнять полученые 3д координаты от координат камеры. Нахрен там пивоты с TformVector'ами )))
|
(Offline)
|
|
28.02.2010, 16:03
|
#8
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: райпик в физиксе
да это без разницы)) лишь бы работало)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:30.
|