Показать сообщение отдельно
Старый 10.07.2008, 00:04   #1
Maxim1441
Нуждающийся
 
Регистрация: 09.07.2008
Сообщений: 57
Написано 11 полезных сообщений
(для 26 пользователей)
Для RTS: как определить3D-координаты поверхности под 2D-курсором?

В общем, нужно определить 3D координаты поверхности под курсором мыши. Я использовал чужой код (правда, не знаю чей), но он действует только если не менять угол наклона камеры по оси X. А в RTS это не канает. В примере я добавил код, чтобы при нажатии ЛКМ под курсором появлялся Cone. Если не менять угол камеры, то все нормально, а если менять - то хана, не совпадает. Да еще же надо, чтобы объект вставал ровно, а не менял ориентацию по иску всед за камерой. Наверное, в код надо вносить поправку на угол наклона камеры. Может, кто знает, как этого добится? Заранее благодарю.


ScreenWidth = 1024
ScreenHeight = 768


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 = 20


z=LoadMesh ("1.b3d")


PositionEntity Camera,0,20,0
d=CreateLight ()
AmbientLight 255,255,255
CameraRange Camera,1,4000


Repeat


If KeyDown (17) Then TranslateEntity Camera,0,0,3
If KeyDown (31) Then TranslateEntity Camera,0,0,-3
If KeyDown (30) Then TranslateEntity Camera,-3,0,0
If KeyDown (32) Then TranslateEntity Camera,3,0,0
If KeyDown (209) Then TurnEntity Camera,1,0,0
If KeyDown (201) Then TurnEntity Camera,-1,0,0




;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))
;############################################

If MouseHit (1) Then ttt=CreateCone(): PositionEntity ttt, Wx, 0, Wz: RotateEntity(ttt, EntityPitch(Camera), EntityYaw(Camera), EntityRoll(Camera))



RenderWorld()
Flip()
Until KeyDown(1)
End
Вложения
Тип файла: zip RTS.zip (306.7 Кб, 708 просмотров)

Последний раз редактировалось Maxim1441, 10.07.2008 в 00:10. Причина: Забыл исходник вставить :-(
(Offline)
 
Ответить с цитированием