Нуждающийся
Регистрация: 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
Последний раз редактировалось Maxim1441, 10.07.2008 в 00:10.
Причина: Забыл исходник вставить :-(
|