Итак, я успешно создал луч, который представляет мышь, не проецируемую в мир, и теперь мне нужно проверить, может ли этот луч пересекаться с четырехугольным объектом, вот код, который я использую для получения луча:
public Ray GetMouseRay()
{
Vector2 mousePosition = new Vector2(cursor.getX(), cursor.getY());
Vector3 nearPoint = new Vector3(mousePosition, 0);
Vector3 farPoint = new Vector3(mousePosition, 1);
nearPoint = viewport.Unproject(nearPoint, projectionMatrix, viewMatrix, Matrix.Identity);
farPoint = viewport.Unproject(farPoint, projectionMatrix, viewMatrix, Matrix.Identity);
Vector3 direction = farPoint - nearPoint;
direction.Normalize();
return new Ray(nearPoint, direction);
}
Точно так же это моя четырехугольная структура, которую я использую для рисования «кубического мира» в трехмерном пространстве. общедоступная структура Quad {public Vector3 Origin; общедоступный Vector3 UpperLeft; общедоступный Vector3 LowerLeft; общедоступный Vector3 UpperRight; общедоступный Vector3 LowerRight; общедоступный Vector3 Normal; общедоступный Vector3 Up; общедоступный Vector3 Left;
public VertexPositionNormalTexture[] Vertices;
public int[] Indexes;
public short[] Indexes;
public Quad( Vector3 origin, Vector3 normal, Vector3 up,
float width, float height )
{
Vertices = new VertexPositionNormalTexture[4];
Indexes = new short[6];
Origin = origin;
Normal = normal;
Up = up;
// Calculate the quad corners
Left = Vector3.Cross( normal, Up );
Vector3 uppercenter = (Up * height / 2) + origin;
UpperLeft = uppercenter + (Left * width / 2);
UpperRight = uppercenter - (Left * width / 2);
LowerLeft = UpperLeft - (Up * height);
LowerRight = UpperRight - (Up * height);
FillVertices();
}
private void FillVertices()
{
// Fill in texture coordinates to display full texture
// on quad
Vector2 textureUpperLeft = new Vector2( 0.0f, 0.0f );
Vector2 textureUpperRight = new Vector2( 1.0f, 0.0f );
Vector2 textureLowerLeft = new Vector2( 0.0f, 1.0f );
Vector2 textureLowerRight = new Vector2( 1.0f, 1.0f );
// Provide a normal for each vertex
for (int i = 0; i < Vertices.Length; i++)
{
Vertices[i].Normal = Normal;
}
// Set the position and texture coordinate for each
// vertex
Vertices[0].Position = LowerLeft;
Vertices[0].TextureCoordinate = textureLowerLeft;
Vertices[1].Position = UpperLeft;
Vertices[1].TextureCoordinate = textureUpperLeft;
Vertices[2].Position = LowerRight;
Vertices[2].TextureCoordinate = textureLowerRight;
Vertices[3].Position = UpperRight;
Vertices[3].TextureCoordinate = textureUpperRight;
// Set the index buffer for each vertex, using
// clockwise winding
Indexes[0] = 0;
Indexes[1] = 1;
Indexes[2] = 2;
Indexes[3] = 2;
Indexes[4] = 1;
Indexes[5] = 3;
}
}
Я обнаружил, что у класса лучей есть метод crosscts (), который принимает структуру plane в качестве параметра, а структура плоскости принимает нормаль и расстояние от начала координат в конструкторе, но мои плоскости имеют положение и нормальный, а не просто расстояние от источника, поэтому я не могу их преобразовать. Как я могу определить, пересекает ли мой луч мою четырехугольную структуру?
Изменить: я понимаю, что не могу использовать структуру плоскости, так как она не имеет конечного размера и не включает углы, как мой четырехугольник. Теперь мне нужно найти способ определить, пересекает ли этот луч созданный мною четырехугольник ...
Спасибо за чтение, я понимаю, что этот вопрос немного длинноват, и заранее спасибо.