: formule d'un vecteur tangent en un point d'une sphère? [3D] - Programmation
Marsh Posté le 10-01-2002 à 11:33:16
D'après mes souvenirs d'ancien matheux d'il y a 25 ans, des vecteurs tangeants à une sphère, y en a une infinité qui remplit justement un plan. Si on ne fixe pas une contrainte de plus, y a des tonnes (infinie) de solutions.
Faudrait être un peu plus précis sur le besoin .
Si le vecteur tangeant doit être dans un certain plan qui coupe la sphère (passant par le centre), il y en a deux (de sens opposés en fait).
Marsh Posté le 10-01-2002 à 11:33:43
La solution n'est pas un vecteur mais un plan donc il faut 2 vecteurs pour le définir à moins que je n'aie pas compris ce que tu voulais.
-- Merde grillaid --
[edtdd]--Message édité par n0mad--[/edtdd]
Marsh Posté le 10-01-2002 à 12:46:22
c'est pour faire du bump ? y'a toute la doc sur le site de nvidia
pour les formules & co, tu peux commencer du côté de la faq de comp.graphics.algorithms : http://www.faqs.org/faqs/graphics/algorithms-faq/
Marsh Posté le 10-01-2002 à 17:57:03
Krueger a écrit a écrit : Je parle bien d'un vecteur et non d'un plan. Merci d'avance! |
et bien il suffit de prendre un vecteur du plan
defini par la normale a la sphere.
Comment calculer la normale a la sphere?
ultra simple dans le cas d'une sphere:
tu as ton point, tu as le centre de la sphere,
tu relies les deux et tu as ton vecteur normal
(que tu normalises derriere pour avoir une vraie normale).
Bon maintenant comment avoir un vecteur du plan tangent
a la sphere?
par exemple si ton vecteur normal c'est n = (nx, ny, nz)
tu perturbes legerement, v = (nx+1, ny, nz)
tu prends le produit scalaire: k = n.v = nx(nx+1)+ ny *ny + nz * nz = nx + 1
et alors tu trouves un vecteur tangent en faisant la projection
du vecteur perturbe sur le plan tangent:
t = v - k * n;
ca ne marche que si n est unitaire et si v n'est pas colineaire
a n. si v est colineaire a n alors n = (1, 0, 0) ou (-1, 0, 0)
et tu peux prendre t = (0,1,0)
NB : et tu normalises derriere si tu veux un vecteur unitaire
t' = t/sqrt(t.t);
tu peux en trouver un deuxieme si tu fais
t2 = t'^n; (produit vectoriel)
et en prime (n, t', t2) represente une base orthonormee locale a ton point.
A+
LEGREG
[edtdd]--Message édité par legreg--[/edtdd]
Marsh Posté le 10-01-2002 à 21:16:50
Merci merci!
Je vais pourvoir continuer mon programme de lancer de rayon.
Marsh Posté le 10-01-2002 à 23:53:05
Pour calculer la normale en un point d'intersection. Le calcule deux tangentes du point dans le repère canonique pour ensuite les transformer vers le repère universel et en déduire la normale.
Marsh Posté le 11-01-2002 à 01:20:31
je comprends toujours pas - si tu as un point sur une sphère tu peux retrouver la normale directement, comme le disait legreg.
ok, je rephrase - tu t'en sers pour quoi de la normale ?
Marsh Posté le 11-01-2002 à 02:02:08
C'est que les transformations géométriques ne conservent pas les normales, mais les tangentes oui. Après il y a une histoire de repère canonique / repère universel, mais bon je ne voudrais pas trop m'attarder dessus.
Citation : ok, je rephrase - tu t'en sers pour quoi de la normale ? |
Ben à plein de choses. Calculs de rayons réfléchis/réfractés et de luminosité notamment.
Marsh Posté le 11-01-2002 à 02:12:48
sisi, attarde-toi un peu, car je ne comprends toujours pas
si tu veux conserver ta normale, il suffit de transformer le point + le point formé du (point + la normale), de recalculer le vecteur et de normaliser - et encore, c'est si tu fais des trucs bizarres (shear & co). pour des changements de repères, tu peux te contenter te transformer ta normale par la matrice 3x3 issue de la 4x4 (ie gicler la partie translation).
tu veux pas mettre un bout d'algo ? voir un peu dans quel cadre s'incrit le calcul des tangentes ... j'ai bô chercher, je vois vraiment pas (mais ok, je n'ai jamais fait de raytracer )
Marsh Posté le 11-01-2002 à 02:56:48
youdontcare a écrit a écrit : si tu veux conserver ta normale, il suffit de transformer le point + le point formé du (point + la normale), de recalculer le vecteur et de normaliser - et encore, c'est si tu fais des trucs bizarres (shear & co). pour des changements de repères, tu peux te contenter te transformer ta normale par la matrice 3x3 issue de la 4x4 (ie gicler la partie translation). |
bon ce que je pense que krueger voulait expliquer
c'est que par exemple tu as un surface S,
un point P sur cette surface et (t1, t2) un systeme
de deux vecteurs tangents a cette surface, n un vecteur normal.
Par la transformation S->S', P->P', (t1,t2)->(t'1, t'2), n->n'.
Ce qui est conserve :
S' est la surface transformee, P' appartient
a S'. (t'1, t'2) est toujours un systeme de deux
vecteurs tangents a S' en P'. (en supposant
que la transformation conserve des proprietes
de continuite locale..)
Par contre n' n'est pas (sauf cas particulier)
un vecteur normal a la surface S' en P'.
Pas de probleme car on a n" = t'1^t'2
qui est un vecteur orthogonal aux deux tangentes
donc une normale a la surface S' en P'
apres une petite normalisation.
Reste a definir a partir de la transformation
qui transforme un point en un autre point,
la transformation qui transforme un vecteur
en ce point en son vecteur transforme.
Mais pas trop difficile si la transformation
est lineaire => basee sur une matrice.
LEGREG
Marsh Posté le 11-01-2002 à 02:59:08
bon il se fait un peu tard
j'espere ne pas avoir raconte trop de conneries
LEGREG
Marsh Posté le 11-01-2002 à 03:20:27
legreg > yep il se fait tard, et j'ai du mal à voir pourquoi on ne pourrait pas conserver la normale. pourquoi la normale issue de deux vecteurs transformés serait moins déformée que le vecteur normale lui-même ? ou que la normale recalculée à partir du point transformé et du (point + la normale) transformé puis normalisé.
de plus il parle d'une sphère, un objet plutôt trivial dans le raytracing.
donc
Marsh Posté le 11-01-2002 à 10:42:40
bon ben imagine une transformation non lineaire:
P(x,y,z) -> P'(x, y, z + sin(x))
en gros ca transforme S une surface plane horizontale (cas le plus simple) en surface S' avec des vagues.
tu remarques qu'a l'exception de certains points
la direction de ta normale a change (la normale de la surface a change, je ne parle pas de la transformee de la normale).
Or si tu te places dans le referentiel du point P0(x0, y0, z0) de S et de son transforme P'(x'0,y'0,z'0) de S' et que tu consideres la transformation "locale linearisee" P(x, y, z) -> P(x, y, z + sin(x0) + sin'(x0)*x).
Si tu appliques cette transformation au vecteur normal n(0,0,1)
de S en P0 tu retombes sur le meme vecteur n(0,0,1).
Donc bug si tu te bases sur cette information pour calculer la nouvelle normale car elle sera systematiquement dans
la mauvaise direction.
A+
LEGREG
ps: desole si mes explications ne sont pas tres "mathematiques"
notamment pour les histoires de "locale linearise"
Marsh Posté le 11-01-2002 à 11:14:04
Essayons avec un contre-exemple:
Considère un losange carré centré à l'origine dont ses sommets sont situés sur les axes du repère. Prends un de ses points, (a,a) par exemple. La normale en ce point est (a,a).
Maintenant applique une homothétie de rapport rx selon l'axe des abscisses. Ton point devient alors (rx * a,a). Si tu prends le vecteur (rx * a,a), représente-il la normale en ce point? Pour le savoir prends rx très grand. Tu verras que ce n'est pas du tout le cas. Fais-toi un petit dessin à côté.
[edtdd]--Message édité par Krueger--[/edtdd]
Marsh Posté le 11-01-2002 à 11:16:31
oui c'est vrai qu'une simple homothetie suffit
comme contre exemple
bon faut que je dorme un peu moi..
LEGREG
Marsh Posté le 11-01-2002 à 15:20:46
je vois un peu mieux. effectivement si tu fais un scale sur ta sphère, c'est un moyen de recalculer la normale. j'avais fait ça pour la normale à un patch bézier, dérivation u et v en chaque point puis produit vectoriel pour la normale.
mais qu'est-ce que ça vient faire dans un raytracer ? à moins que tes sphères soient scalées dans tous les sens, ok ...
Marsh Posté le 11-01-2002 à 20:55:12
Ben mes objets sont définis à partir de transformations d'objets canoniques, c'est à dire des objets très simples à manipuler (par exemple une sphère de rayon 1 centrée à l'origine). Donc pour un objet donné je fais la plupart de mes calculs dans son repère canonique pour ensuite projeter le tout dans le repère universel et avoir les résultats recherchés.
Et puis oui, je souhaite pouvoir représenter des patates.
Marsh Posté le 11-01-2002 à 22:30:29
Je comprends rien à ce que vous dites !!!
Bon je vais revenir demain apres un bon dodo et je comprendrais surement mieux.
Marsh Posté le 10-01-2002 à 10:40:45
Désolé de poster ça ici, mais les maths et moi ça fait 2 et je n'ai réussi à rien trouver sur le net. Trop souvent des sites qui traitent d'autres problèmes, mais pas une trace de la formule que je cherche!
Alors si quelqu'un pouvait me la donner ça me dépannerait énormément. Mieux, un site rempli de formules géométriques spatiales pour les sphères et/ou les courbes spatiales que je n'ai pas réussi à trouver.
Je parle bien d'un vecteur et non d'un plan. Merci d'avance!
---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi