2011-09-16 3 views
3

Je travaille sur un moteur JavaScript/Canvas FPS comme 3D et désespérément besoin d'un vecteur normal (ou Recherch à vecteur si vous voulez) pour clipping plane près et de loin. J'ai les angles de rotation de l'axe x et y et suis capable de le faire facilement avec un seul d'entre eux à la fois, mais je n'arrive pas à comprendre comment les obtenir tous les deux ...3D normal/chercher au vecteur d'angles d'Euler

L'idée est de utiliser ce vecteur pour calculer un point devant la caméra, les plans de clipping proche et lointain doivent aussi être définissables par des constantes donc le vecteur doit être normalisé, j'espérais qu'avec seulement les angles il serait possible d'obtenir cette longueur de vecteur à 1 sans normalisation, mais ce n'est pas le problème.

Je n'ont pas de rouleau (rotation autour de l'axe z) donc il est beaucoup plus facile.

Mon mathématiques ressemble à ceci:

zNear = 200; // near plane at an arbitrary 200 "points" away from camera position 

// normal calculated with only y rotation angle (vertical axis) 
normal = { 
    x: Math.sin(rotation.y), 
    y: 0, 
    z: Math.cos(rotation.y)}; 

puis accrochez un point dans l'espace 3D en testant le vecteur du plan à elle au moyen d'un produit scalaire.

nearPlane = { 
    x: position.x+normal.x*zNear, 
    y: position.y+normal.y*zNear, 
    z: position.z+normal.z*zNear}; 

// test a point at x, y, z against the near clipping plane 
if(
    (nearPlane.x-x)*normal.x+ 
    (nearPlane.y-y)*normal.y+ 
    (nearPlane.z-z)*normal.z < 0 
) 
{ 
    return; 
} 

// then project the 3D point to screen 

Lorsqu'un point est derrière le joueur ses coordonnées de projection sont inversées (x = -x, y = -y) donc rien n'a de sens plus, c'est pourquoi je suis en train de les supprimer.

enter image description here

Je veux que la flèche verte là-bas, mais en 3D.

+0

Si vous me donnez 3 points A, B, C faisant deux vecteurs (AB et BC), je peux vous obtenir une normale en utilisant le produit croisé ... Est-ce que l'aide? – dustmachine

+0

@dustmachine: non, j'ai besoin du vecteur look-at des angles de rotation d'Euler x et y, je n'ai pas d'autres données. – Solenoid

Répondre

2

Après un certain traitement de cerveau intensif, je compris que

  1. Mon look à vecteur d'origine était (0, 0, 1)
  2. L'angle z-rotation (rouleau) était toujours 0
  3. Il n'y avait aucune raison pour que la matrice de rotation trouvée sur Wikipedia ne pas travailler

en appliquant la matrice complète de rotation sur la (0, 0, 1) vecteur et en tenant compte que rz = 0 la solution que je suis arrivé était:

normal = { 
    x: Math.cos(camera.rotation.x)*Math.sin(camera.rotation.y), 
    y: -Math.sin(camera.rotation.x), 
    z: Math.cos(camera.rotation.y)*Math.cos(camera.rotation.x)}; 

Et maintenant tout fonctionne parfaitement. L'erreur n'utilisait que les matrices de rotation x et y sans prendre en compte rz = 0 pour tous les angles qui modifiaient un peu la matrice.

Questions connexes