Хорошо. Очень трудно понять, что не так, я попробую все же.
Вот несколько советов и замечаний:
1) Вы можете отлаживать указания, сопоставляя их с цветом RGB. Имейте в виду, что вы должны нормализовать векторы и карту от (-1,1)
до (0,1)
. Просто делай вещи типа dir*0.5+1.0
. Пример:
color = vec4(normalize(rayDirection) * 0.5, 0) + vec4(1);
2) Вы можете получить матрицу вращения более прямым способом. Кватернион инициализируется из прямого направления, сначала он будет вращаться вокруг оси Y (горизонтальный вид), затем и только затем вокруг оси X (вертикальный вид). Имейте в виду, что порядок вращения зависит от реализации, если вы инициализируете с углов Эйлера. Используйте mat4_cast, чтобы по возможности избежать экспериментального расширения glm (gtx). Пример:
// Define rotation quaternion starting from look rotation
glm::quat camRotation = glm::vec3(0, 0, 0);
camRotation = glm::rotate(camRotation, glm::radians(camRotY), glm::vec3(0, 1, 0));
camRotation = glm::rotate(camRotation, glm::radians(camRotX), glm::vec3(1, 0, 0));
glm::mat4 camToWorldMatrix = glm::mat4_cast(camRotation);
3) Ваш beforeRotateRayDirection
- это вектор, который (вероятно) указывает от (-1, -1, -1) вплоть до (1,1, -1). Что не нормализовано , длина (1,1,1) составляет √3 ≈ 1.7320508075688772 ... Убедитесь, что вы учли это для своей математики столкновений или просто нормализовали вектор.
Пока что мой частичный ответ ...
Ваш тест на столкновение немного странный ... Похоже, вы хотите навести луч в плоскость Z для данной позиции ячейки (но дважды, один для спереди и один сзади). Я рассмотрел ваш код logi c, и он имеет некоторый смысл, но без вершинной программы, поэтому, не зная, каковы значения диапазона texCoord
, невозможно быть уверенным. Возможно, вы захотите переосмыслить свою логику c примерно так:
int RayHitCell(vec3 origin, vec3 direction, vec3 cellPosition, float cellSize)
{
//Get triangle side vectors
vec3 tu = vec3(cellSize,0,0); //Triangle U component
vec3 tv = vec3(0,cellSize,0); //Triangle V component
//Determinant for inverse matrix
vec3 q = cross(direction, tv);
float det = dot(tu, q);
//if(abs(det) < 0.0000001) //If too close to zero
// return;
float invdet = 1.0/det;
//Solve component parameters
vec3 s = origin - cellPosition;
float u = dot(s, q) * invdet;
if(u < 0.0 || u > 1.0)
return 0;
vec3 r = cross(s, tu);
float v = dot(direction, r) * invdet;
if(v < 0.0 || v > 1.0)
return 0;
float t = dot(tv, r) * invdet;
if(t <= 0.0)
return 0;
return 1;
}
void main()
{
// For now I'm not accounting for FOV and aspect ratio because I want to get the
// rotation working first
vec4 beforeRotateRayDirection = vec4(texCoord.x, texCoord.y, -1, 0);
// Apply the rotation matrix that was generated on the cpu
vec3 rayDirection = vec3(cameraTransformationMatrix * beforeRotateRayDirection);
int t = RayHitCell(cameraPosition, normalize(rayDirection), vec3(0,0,5), 1);
if (t == 1)
{
// Hit front plane
color = vec4(0, 0, 1, 0);
}
else
{
// background color
color = vec4(0, 1, 0, 0);
}
}
Это должно дать вам самолет, дайте мне знать, если он работает. Куб будет очень легко сделать.
PS .: u
и v
могут использоваться для наложения текстуры.