2009-11-20 16 views
2

Mon problème:Comment puis-je transformer un point d'intersection de plan de rayon en coordonnées barycentriques?

Comment puis-je prendre deux points 3D et les verrouiller sur un seul axe? Par exemple, de sorte que leurs deux axes z sont 0.

Ce que je suis en train de faire:

J'ai un ensemble de coordonnées 3D dans une scène, ce qui représente la boîte aa avec une pyramide sur elle . J'ai aussi une caméra, représentée par une autre coordonnée 3D. Je soustrais la coordonnée de la caméra de la coordonnée de la scène et la normalise, renvoyant un vecteur qui pointe vers la caméra. Je fais ensuite l'intersection de plan de rayon avec un avion qui se trouve derrière le point de caméra.

O + tD 

Où O (origine) est la position de la caméra, D est la direction du point de la scène vers la caméra et t est le temps qu'il faut pour que le rayon jusqu'au point d'intersection du plan à partir du point de la caméra.

Si cela n'a pas de sens, voici un dessin brut:

Crude drawing

J'ai cherché loin, et pour autant que je peux dire, cela est appelé à l'aide d'un « sténopé ".

Le problème n'est pas ma rotation de caméra, j'ai éliminé cela. Le problème est de traduire le point d'intersection en coordonnées barycentriques (uv).

La traduction sur l'axe des x ressemble à ceci:

uaxis.x = -a_PlaneNormal.y; 
uaxis.y = a_PlaneNormal.x; 
uaxis.z = a_PlaneNormal.z; 

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal); 

point2d.x = intersection.DotProduct(uaxis); 
point2d.y = intersection.DotProduct(vaxis); 

return point2d; 

Alors que la traduction sur l'axe z ressemble à ceci:

uaxis.x = -a_PlaneNormal.z; 
uaxis.y = a_PlaneNormal.y; 
uaxis.z = a_PlaneNormal.x; 

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal); 

point2d.x = intersection.DotProduct(uaxis); 
point2d.y = intersection.DotProduct(vaxis); 

return point2d; 

Ma question est: comment puis-je transformer une point d'intersection du plan de rayon aux coordonnées barycentriques sur les axes x et z?

+0

Je ne comprends pas ce que vous voulez dire dans votre question sous "Mon problème". Qu'est-ce que cela signifie de verrouiller 2 points dans un axe? Cherchez-vous une transformation qui alignera la ligne à travers les points le long d'un axe? De plus, les coordonnées barycentriques n'ont de sens que pour les triangles ou éventuellement d'autres polygones convexes. Voulez-vous simplement dire des coordonnées paramétriques dans le plan perpendiculaire à l'axe susmentionné? –

+0

Oui, je cherche une transformation qui alignera les points le long d'un axe. Je ne suis pas très familier avec les termes mathématiques, mais ce que je veux dire par «coordonnées barycentriques» est le décalage x et y du point d'intersection par rapport au point d'origine plan. Un plan est défini comme un point dans l'espace et un normal et est infini à toutes fins utiles. Si je peux verrouiller les deux points à un seul axe, je peux simplement faire point2d = Vec3 (intersection.x - origine.x, intersection.y - origine.y, 0). La deuxième méthode résout le même problème. – knight666

Répondre

3

La formule générale pour les points (P) sur une ligne, à partir de (p0) avec une direction de vecteur (v) est la suivante:

p = p0 + t*v 

Le critère pour un point (P) sur un plan contenant (p1) et avec la normale (n) est:

(p - p1).n = 0 

Ainsi, brancher & souffle:

(p0 + t*v - p1).n = (p0-p1).n + t*(v.n) = 0 

    -> t = (p1-p0).n/v.n 
    -> p = p0 + ((p1-p0).n/v.n)*v 

Pour vérifier:

(p - p1).n = (p0-p1).n + ((p1-p0).n/v.n)*(v.n) 
        = (p0-p1).n + (p1-p0).n 
        = 0 

Si vous voulez fixer la coordonnée Z à une valeur particulière, vous devez choisir une normale le long de l'axe Z (qui définira un plan parallèle au plan XY).

Ensuite, vous avez:

n = (0,0,1) 

    -> p = p0 + ((p1.z-p0.z)/v.z) * v 
    -> x and y offsets from p0 = ((p1.z-p0.z)/v.z) * (v.x,v.y) 

Enfin, si vous essayez de construire une « caméra » virtuel pour l'infographie 3D, la méthode standard pour faire ce genre de chose est homogeneous coordinates.En fin de compte, travailler avec des coordonnées homogènes est plus simple (et généralement plus rapide) que le type d'algèbre vectorielle 3D ad hoc que j'ai écrit plus haut.

+0

Je veux juste vous remercier pour votre aide. C'était un problème très difficile pour moi, mais je l'ai compris. :) La réponse réside dans le calcul des nouveaux axes x et y basés sur le vecteur directionnel de la caméra en tant que nouvel axe z. Après cela, il est devenu question d'une simple intersection de plans de rayons et de pointillés le point d'intersection avec les nouveaux axes x et y. – knight666