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