2013-12-17 3 views
1

Я хотел бы начать заявлять о своей цели с этим вопросом, В настоящее время я создаю небольшой игровой движок в C++ и DirectX, и сейчас я нахожусь в точке, где Мне нужно raycast на рекламных щитах (типа, которые всегда смотрят на камеру) и моделей.Как получить Vector3 из матрицы

для моей старомодной игры, raycasting в рекламных щитах немного более важно, так что давайте оставим модель raycasting полностью из этого.

В настоящее время я использую следующий код, чтобы проверить против моего спрайта:

for(int i = 0; i < spriteObjs.size();i++) 
    { 
     BOOL hit = FALSE; 
     FLOAT distToHit = 100; 
     D3DXVECTOR3 v1 = D3DXVECTOR3((-2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     D3DXVECTOR3 v2 = D3DXVECTOR3((2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     D3DXVECTOR3 v3 = D3DXVECTOR3((-2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(-5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     D3DXVECTOR3 v4 = D3DXVECTOR3((2.5f*spriteObjs.at(i)->scaling.x)+spriteObjs.at(i)->position.x,(-5*spriteObjs.at(i)->scaling.y)+spriteObjs.at(i)->position.y,0+spriteObjs.at(i)->position.z); 
     if(D3DXIntersectTri(&v1,&v2,&v3,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
     { 
      //cout << "hit target: "<<spriteObjs.at(i)->quad.textureName << " at distance: " << distToHit << endl; 
     } 
     if(D3DXIntersectTri(&v2,&v3,&v4,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
     { 
      //cout << "hit target: "<<spriteObjs.at(i)->quad.textureName << " at distance: " << distToHit << endl; 
     } 
    } 

Это приводит к давая верно, когда, глядя на спрайт, а затем проверить луч, ОДНАКО, это не учитывает для вращение, данное viewmatrix на самом спрайте, так что это работает для «вид спереди» спрайта, но при взгляде на него (это плоскость, так что она не имеет ширины) вы никогда не сможете ударить ее. конечно, потому что это нарисовано с его лицом к камере, вы все еще видите фронт спрайта как обычно.

но в коде это не отражено, это просто статический квадрат здесь, поэтому мне нужно получить поворот из мировой матрицы (или инвертированной матрицы просмотра (ваш выбор)) и умножить/вычислить ее с помощью определения vector3 положение вершины (в данном случае v1 до v4)

некоторых дополнительный код того, как я определил свои вершины в кваде (так что вы получите, почему 2,5 и 5 происходят из)

VertexPosNorTex triangleVerts[] = 
{ 
    {D3DXVECTOR3(-2.5,5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(0,0)}, 
    {D3DXVECTOR3(2.5,5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(1,0)}, 
    {D3DXVECTOR3(-2.5,-5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(0,1.5)}, 
    {D3DXVECTOR3(2.5,-5,0),D3DXVECTOR3(1,0,0),D3DXVECTOR2(1,1.5)}, 
}; 

это приведет к появлению квадроцикла, похожего на

5 
---------- 
|  | 
|  | 
|  | 
|  | 10 
|  | 
|  | 
|  | 
---------- 

, который превратил бы анкерную точку спрайта с спрайтом в середине, где я использую только верхнее УФ-пространство для текстуры (нижняя часть остается прозрачной, поэтому вы ее не увидите (это помогает с проблемой ее просмотра) как они летят над землей, когда смотрел на с большим углом)

Итак .. с достаточным объяснением и мой вопрос на полпути, вот

TL; DR

Как превратить мой вершинные позиции с повернутой версией (матрицей) обратно в Vector3 со своими позициями во вращающейся форме (так что 1 вершина wi го поворота на (1,0,0) будет походить (0,86,0,0,1314) после извлечения его обратно из матрицы, например. (пример просто случайное число, а не в результате какого-либо кода или математики)

ответ

0

Кто-то на моей странице FB комментировало:

Просто преобразовать вершины с D3DXVec3Transform или что-то, так, вы получите Vector4, но вы можете просто игнорировать w-компонент для матрицы преобразования.

-I еще не проверял его (я скоро), но я на 100% уверен, что это сработает с моим кодом, поскольку у меня уже 99% того, что реализовано в той же функции, но я не сделал используйте его правильно

+0

так что это своего рода работы, он имеет странное смещенной под разными углами и позиции меняются с более чем 100 на X под разными углами, а спрайт шириной только 5, я не могу полностью выяснить почему .. – Themperror

0

Неочищенный раствор, но он работает .. он не так хорош, как получение поворотов из матрицы вида (я бы получил кватернионы, которые почти невозможно преобразовать в эйлеры), но он работает ..

for(int i = 0; i < spriteObjs.size();i++) 
    { 
     if(Vector3Distance(&spriteObjs.at(i)->position,&camera.position) < 150) 
     { 
      BOOL hit = FALSE; 
      FLOAT distToHit = 100; 

      float x = 1 * std::cos((angleX+90) * 3.141592f/180); 
      float z = 1 * std::sin((angleX+90) * 3.141592f/180); 
      D3DXVECTOR3 v1 = D3DXVECTOR3((-2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(-2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z);// 
      D3DXVECTOR3 v2 = D3DXVECTOR3((2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z); 
      D3DXVECTOR3 v3 = D3DXVECTOR3((-2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(-2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(-2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z); 
      D3DXVECTOR3 v4 = D3DXVECTOR3((2.5f *spriteObjs.at(i)->scaling.x/2)* x + spriteObjs.at(i)->position.x ,(-2.5f *spriteObjs.at(i)->scaling.y) +spriteObjs.at(i)->position.y  ,(2.5f *spriteObjs.at(i)->scaling.z/2)* z + spriteObjs.at(i)->position.z); 

      if(D3DXIntersectTri(&v1,&v2,&v3,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
      { 
       cout << "hit target: "<<spriteObjs.at(i)->objName << " at distance: " << distToHit << endl; 
      } 
      if(D3DXIntersectTri(&v2,&v3,&v4,&camera.position,&lookDir,NULL,NULL,&distToHit)) 
      { 
       cout << "hit target: "<<spriteObjs.at(i)->objName << " at distance: " << distToHit << endl; 
      } 
     } 
    } 
Смежные вопросы