forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   райпик в физиксе (http://forum.boolean.name/showthread.php?t=12066)

Coks 27.02.2010 23:59

райпик в физиксе
 
Здрасте! Кто знает, подскажите пожалуйста, как строить луч пика (враппер под блиц) по направлению камеры. Буду признателен. По моим домыслам это неосуществимо.

H@NON 28.02.2010 00:13

Ответ: райпик в физиксе
 
Код:

;Разрешение
      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д, ставишь в это положение какой-нить пивот, затем находишь углы поворота этого пивота относительно камеры и поворачиваешь луч, вроде должно работать

Coks 28.02.2010 09:56

Ответ: райпик в физиксе
 
С физиксом не прокатит. Луч можно позиционировать и задать направление (pxRaySetDir), вектором. Вот не пойму как это сделать, чтоб луч поворачивал в нужную сторону.

Reizel 28.02.2010 10:10

Ответ: райпик в физиксе
 
Блин, H@non, ты что творишь!
насколько я помню, лучу надо подставить вектора направления по всем осям, а значит:
TFormVector 0,0,1,Camera,0
aX#=TFormedX#()
aY#=TFormedY#()
aZ#=TFormedZ#()

вот тебе и вектора направления :)

H@NON 28.02.2010 12:09

Ответ: райпик в физиксе
 
это подойдет если тебе нужно луч центровать ровно по центру экрана, а я показал случай когда нужно луч выстрелить в координаты мыши. Как только разместил пивот в переведенных из 2д в 3д координаты также через TformVector получаем вектор направления взгляда луча, и подставляешь значения для поворота луча. Потом накатаю пример, если уж сами не можете додумать код, может прояснит ситуацию.

Coks 28.02.2010 13:56

Ответ: райпик в физиксе
 
Павел, спасибо! Это то мне и надо было. Плохо, что сам не додумался :)

Alex.D. 28.02.2010 16:00

Ответ: райпик в физиксе
 
Цитата:

Сообщение от H@NON (Сообщение 139935)
Как только разместил пивот в переведенных из 2д в 3д координаты также через TformVector получаем вектор направления взгляда луча, и подставляешь значения для поворота луча.

Да ты ж упоротый, в приведенном коде найти вектор - отнять полученые 3д координаты от координат камеры. Нахрен там пивоты с TformVector'ами :))))

H@NON 28.02.2010 16:03

Ответ: райпик в физиксе
 
да это без разницы)) лишь бы работало)


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

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