如何将Raycast方向设置为90度而不是通过相机

时间:2017-10-06 07:58:20

标签: math unity3d 3d

我的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
}

enter image description here

两次尝试都以相同的方式产生。如果坐标位于中心附近,那么它也位于接收器的中心。但是越往边缘它就越远离它应该的位置。图为我认为的情况。红色圆圈是当前的行为,绿色是我所期待的。我宁愿从屏幕到墙壁的光线比通过凸轮的光线高90度。 我真的不知道该怎么办。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你对你的绘图是正确的,这确实是正在发生的事情。

以下是我使用Debug.DrawRay进行的测试。 enter image description here

蓝色光线是此代码的输出。

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

结果 enter image description here