Моим решением было сделать то, что предложил sje397, но просто использовать результат в качестве вашего нового луча.
Итак, в моем проекте (который является XNA), задано ray
без проекции курсора:
rayTransform = Matrix.Invert(model_transform);
//Transform ray (or more accurately its defining components into a new ray)
Vector3 v1 = Vector3.Transform(ray.Position, rayTransform);
Vector3 v2 = Vector3.Transform((ray.Position + ray.Direction), rayTransform);
transformedray = new Ray(v1, v2 - v1);
model_transform
здесь генерируется так же, как преобразование для шейдера (т. Е. Без перестановки умножений World / Local или чего-либо еще)
Это прекрасно работает в моем проекте с цельювыборка поворачивается, трансформируется и масштабируется различными способами.
Кроме того, вы можете найти это немного бесполезным, но если у вас все еще есть проблемы, вы уверены, что код для снятия проекции курсора и генерации луча выбора работаетправо?Я полагаю, что это должно было бы произойти, если бы ваш код выбора треугольника работал, просто мне кажется, что он получает луч «вокруг».
В моем проекте я беру две точки, одну 'на' плоскости 'области просмотра, поэтому Vector3(cursorx,cursory,0)
это снова, но продвижение по оси Z Vector3(cursorx,cursory,1)
.Отпроектируйте оба этих пункта, результат первого - ваше происхождение, а разница - ваше направление.
Удачи!