Показать сообщение отдельно
Старый 15.04.2020, 07:40   #7
leshiyru70
AnyKey`щик
 
Аватар для leshiyru70
 
Регистрация: 20.01.2019
Адрес: Томск
Сообщений: 6
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Как вычислить 2D координату курсора в 3D мире?

От своей ранее изложенной идеи не отказываюсь, но всё-же слишком надолго застревать на одном месте наверное не стоит. Пока-же реализую функцию по определению 3Д координаты по отношению к 2Д курсору другим способом, который мне предложили АВТОМАТ и КИРПИ4. За что им очень благодарен!
Суть функции такова.
Создаётся Mesh в позиции камеры и направляется в ту-же сторону, далее Mesh отодвигаю от камеры на необходимое расстояние.
MoveEntity msh,0,0,-distance#
Далее в цикле при помощи.
CameraProject (cam,EntityX(msh),EntityY(msh),EntityZ(msh))
iccx=ProjectedX #()
iccy=ProjectedY #()
Узнаю 2Д координату Mesh и передвигаю его в сторону курсора.
Когда 2Д координаты относительно сошлись вывожу 3Д позицию Mesh в тексте "X\Y\Z\"... Ну как-то так.

Вот та самая функция, может кому нужно будет.
; -------------------------------------------------------------------------------
; ПОЗИЦИЯ 2Д КУРСОРА В 3Д КООРДИНАТУ
; cam=личный номер камеры, camW,camH=разрешение экрана,
; distance#=предполагаемая дистанция до 3Д точки
Function FF_2Dto3D$(cam,distance#)
mx=MouseX(): my=MouseY()

; определяю местоположения камеры
camX#=EntityX#(cam)
camY#=EntityY#(cam)
camZ#=EntityZ#(cam)
; поворот камеры по осям XYZ
anglX#=EntityPitch#(cam)
anglY#=EntityYaw#(cam)
anglZ#=EntityRoll#(cam)

; создаю Mesh, ориентирую его в направлении камеры
; и отодвигаю на нужную дистанцию
msh=CreateMesh ()
PositionEntity msh,camX#,camY#,camZ#
RotateEntity msh,anglX#,anglY#,anglZ#
MoveEntity msh,0,0,-distance#

; цикл выравнивания
Repeat
; узнаю координату Mesh в 2Д области экрана
CameraProject (cam,EntityX(msh),EntityY(msh),EntityZ(msh))
iccx=ProjectedX #()
iccy=ProjectedY #()

; передвижение Mesh в сторону курсора
noko=0: xxx#=0: yyy#=0
If iccx<mx-1 Then xxx#=.1: noko=1
If iccx>mx+1 Then xxx#=-.1: noko=1
If iccy<my-1 Then yyy#=-.1: noko=1
If iccy>my+1 Then yyy#=.1: noko=1
MoveEntity msh,xxx#,yyy#,0
Until noko=0
; узнаю координату Mesh в 3Д области
xxx#=EntityX(msh): yyy#=EntityY(msh): zzz#=EntityZ(msh)
; удаляю msh за ненадобностью
FreeEntity msh

; передаю XYZ координаты для использования
XYZ$=xxx#+"\"+yyy#+"\"+zzz#+"\"
Return XYZ$

End Function
; -------------------------------------------------------------------------------
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ABTOMAT (16.04.2020)