Я пытаюсь использовать пересечения лучевой сферы для выбора мыши в OpenGL. В сети я нашел несколько формул, и последняя, которую я попробовал, была предложена пользователем в Stack Exchange:
Из того, что я понял об этом ответе, я проверяю, имеет ли квадратное уравнение положительные корни. Мне действительно все равно, где происходит пересечение, если луч вообще пересекает сферу. Мой код выглядит следующим образом, но, похоже, не работает.
bool Mesh::useObject(vec3 camera, vec3 direction) {
// a = (xB-xA)²+(yB-yA)²+(zB-zA)²
float a = ((direction.v[0] - camera.v[0])*(direction.v[0] - camera.v[0])
+ (direction.v[1] - camera.v[1])*(direction.v[1] - camera.v[1])
+ (direction.v[2] - camera.v[2])*(direction.v[2] - camera.v[2]));
// b = 2*((xB-xA)(xA-xC)+(yB-yA)(yA-yC)+(zB-zA)(zA-zC))
float b = 2 * ((direction.v[0] - camera.v[0])*(camera.v[0] - mOrigin.v[0])
+ (direction.v[1] - camera.v[1])*(camera.v[1] - mOrigin.v[1])
+ (direction.v[2] - camera.v[2])*(camera.v[2] - mOrigin.v[2]));
// c = (xA-xC)²+(yA-yC)²+(zA-zC)²-r²
float c = ((camera.v[0] - mOrigin.v[0])*(camera.v[0] - mOrigin.v[0])
+ (camera.v[1] - mOrigin.v[1])*(camera.v[1] - mOrigin.v[1])
+ (camera.v[2] - mOrigin.v[2])*(camera.v[2] - mOrigin.v[2])
- (mRadius)*(mRadius));
float delta = (b*b) - (4 * a*c);
if (delta < 0)
return false;
else {
std::cout << "Object " << mMesh << " is at postion (" <<
mOrigin.v[0] << ", " <<
mOrigin.v[1] << ", " <<
mOrigin.v[2] << ")\n" <<
"Size: " << mRadius << std::endl;
return true;
}
}
Мои навыки C ++ довольно ржавые, поэтому я прошу прощения, если это ужасный способ сделать это. Этот метод принимает два вектора из трех чисел с плавающей точкой, положение камеры и координаты точки в моей сцене на 1 единицу перед камерой (я назвал это направление).
Я хочу получить положение объекта и его радиус, когда я сталкиваюсь с объектом и нажимаю клавишу, но вместо этого я получаю вывод только тогда, когда я стою на одном из объектов в моей сцене, или если я стою рядом с другим большим объект. Очевидно, что что-то не так с моими вычислениями (или, что еще хуже, с моим кодом), но я не могу понять, что это такое. 🙁
Дайте мне знать, если вам нужно больше кода, или если что-то неясно. Это мой первый вопрос к SO, поэтому, если этот вопрос плохо сформулирован, извините.
РЕДАКТИРОВАТЬ: я не должен был использовать координаты мыши в качестве точки на моем луче. Отредактировал мой вопрос слегка.
Задача ещё не решена.
Других решений пока нет …