forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Для RTS: как определить3D-координаты поверхности под 2D-курсором? (http://forum.boolean.name/showthread.php?t=6095)

Maxim1441 10.07.2008 00:04

Для RTS: как определить3D-координаты поверхности под 2D-курсором?
 
Вложений: 1
В общем, нужно определить 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

HolyDel 10.07.2008 00:34

Ответ: Для RTS: как определить3D-координаты поверхности под 2D-курсором?
 
e = CameraPick(cam,MouseX(),MouseY())
tx# =pickedx()
tz# = pickedz()

Maxim1441 10.07.2008 15:53

Ответ: Для RTS: как определить3D-координаты поверхности под 2D-курсором?
 
Цитата:

Сообщение от HolyDel (Сообщение 82025)
e = CameraPick(cam,MouseX(),MouseY())
tx# =pickedx()
tz# = pickedz()

Э... Спасибо, конечно, но куда это вставлять и как применять, я не понял.

Да и что-то мне кажется, что этот код, который я заимствовал, наверное, не подходит для RTS. Надо-то чтобы в точке, где находится курсор, появлялся объект (дом, например), да так, чтобы по Y он точно "садился" на ландшафт. может, где-то уже лежат готовые примеры, но я про RTS находил только выделение резиновой рамкой, а оно мне не нужно.

HolyDel 10.07.2008 16:43

Ответ: Для RTS: как определить3D-координаты поверхности под 2D-курсором?
 
уууу...

получить выоту террайна в данной точке - TerrainY(map,x,0,z)
вставлять это никуда не надо )) надо понять. суть методы в следующем:
на твой террайн ставится тип пика 2. т.е. по геометрии определяетя точка, в которую смотрит луч из камеры в точку MouseX(),MouseY() viewport-а. Пикаем ( "CameraPick(cam,MouseX(),MouseY())" ), получаем позицию етого самого пика ("tx# =pickedx()","tz# = pickedz()") далее делаем с этими координатами что хотим.

товарищ! смотри здесь скрины стратегии на блице: http://likosoft.ru/e107_plugins/medi...y/browse.php?3
если есть вопросы - спрашивай, это очень добрый форум, наверняка теюе помогут ))

Maxim1441 10.07.2008 16:58

Ответ: Для RTS: как определить3D-координаты поверхности под 2D-курсором?
 
Благодарю! Понял. А то я команды типа pickedz() первый раз увидел, справку почитал - сообразил. Теперь могу 90% кода выкинуть.


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

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