Показать сообщение отдельно
Старый 07.11.2007, 08:35   #22
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Re: Двигать объект двухмерным курсором

Сообщение от MoKa
В первом варрианте, если камера повёрнута куда-либо, то уже не прокатывает.
Это не проблема, можно умножить полученые координаты (вектор) на матрицу трансформации камеры и все. Так же и с другими обьектами, не только с камерой.
;Разрешение
ScreenWidth = 800
ScreenHeight = 600

;Центр экрана
CenterX = ScreenWidth Shr 1
CenterY = ScreenHeight Shr 1

;Инициализация графики
Graphics3D(ScreenWidth, ScreenHeight, 32, 2)
SetBuffer(BackBuffer())

;Камера
Camera = CreateCamera()

;Принудительная установка угла фокуса камеры необходима чтобы проекция
;была корректной т.к. узнать его с помощью средств Блица невозможно
Zoom# = 1.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
Хотя уже поздно, но может кому пригодится.
(Offline)
 
Ответить с цитированием