我的3D项目有问题。描述目的是非常复杂的,所以我尝试将其抽象到最小。 我有一个统一程序的现场视频流,我带到全屏(1920 x 1200)。一个用户点击屏幕将coords发送到统一应用程序。
发送坐标:
// relative coord
float x = mouse_x / 1920.0f;
float y = mouse_y / 1200.0f;
接收器是统一应用程序,它试图制作它的3D坐标并找到墙壁或障碍物来放置标记。
1. Attempt
// 1268 x 720 receiver viewport size
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Position.x * 1268.0f, Position.y * 720.0f, 0));
2. Attempt
// * 1268 not necessary
Vector3 far = Camera.main.ViewportToWorldPoint(new Vector3(fix.Position.x, fix.Position.y, 1));
Vector3 near = Camera.main.ViewportToWorldPoint(new Vector3(fix.Position.x, fix.Position.y, 0));
Vector3 dir = far - near;
dir.Normalize();
Ray ray = new Ray(near, dir);
RaycastHit hitInfo;
if(Physics.Raycast(ray, out hitInfo))
{
// place mark
}
两次尝试都以相同的方式产生。如果坐标位于中心附近,那么它也位于接收器的中心。但是越往边缘它就越远离它应该的位置。图为我认为的情况。红色圆圈是当前的行为,绿色是我所期待的。我宁愿从屏幕到墙壁的光线比通过凸轮的光线高90度。 我真的不知道该怎么办。非常感谢您的帮助。
答案 0 :(得分:1)
你对你的绘图是正确的,这确实是正在发生的事情。
蓝色光线是此代码的输出。
Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * 100f, Color.red);
这是红色的图画,就像你一样。
var viewportPointRay = Camera.main.ViewportPointToRay(viewportTouchPos);
Debug.DrawRay(viewportPointRay.origin, viewportPointRay.direction * 3f, Color.blue);
我期待一个真正简单的答案,但我找不到答案。我确实找到了一个可以做你想要的技巧。
var ray = new Ray(viewportPointRay.origin, Camera.main.transform.forward);
Debug.DrawRay(ray.origin, ray.direction, Color.green);