我正在努力实现一个功能,它基本上告诉我,如果Ray“足够接近”某个对象
基本上我实施了Implementing Ray Picking @nornagon soloution创造了Ray。我在屏幕上的对象以Point为中心。我假设如果Ray距离此点一定距离,则选择该对象。
我称之为3点(X,Y,Z):_ pickFrom,_pickTo和pO
首先,这是我在屏幕上根据鼠标位置计算Ray的方法:
public static void Pick(int x, int y)
{
float nx = 2.0f * ((float)x) / ((float)_width) - 1.0f;
float ny = 1.0f - 2.0f * ((float)y) / ((float)_height);
Matrix4 unview = Matrix4.Invert(Matrix4.Mult(_projectionMatrix, _modelviewMatrix));
Vector4 nearPoint = Vector4.Transform(new Vector4(nx, ny, 0, 1), unview);
_pickTo = nearPoint - _pickFrom;
}
_pickFrom是场景中相机的位置。 _pickTo是pickray的方向。 _width和_height是rendercontext的大小。
我现在如何实现一个函数,它给出了一个点与pickray的距离?
答案 0 :(得分:2)
我现在想出来了:
public void SetMouse(int x, int y)
{
float xpos = 2.0f * ((float)x / (float)_width) - 1.0f;
float ypos = 2.0f* (1.0f - (float)y / (float)_height) - 1.0f;
Vector4 startRay = new Vector4(xpos, ypos, -1, 1);
Vector4 endRay = new Vector4(xpos, ypos, 1, 1);
Matrix4 trans = _modelView.Data * _projection.Data;
trans.Invert();
startRay = Vector4.Transform(startRay, trans);
endRay = Vector4.Transform(endRay, trans);
_pickFrom = startRay.Xyz / startRay.W;
_pickTo = endRay.Xyz / endRay.W;
}
...
public float Distance(Vector3 p)
{
Vector3 x1 = _pickFrom;
Vector3 x2 = _pickTo;
return Vector3.Cross
(Vector3.Subtract(p, x1),
Vector3.Subtract(p, x2)
).Length / Vector3.Subtract(x2, x1).Length;
}