Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 16:58

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Strahl schneidet Ebene
BeitragVerfasst: Mi Mär 09, 2011 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
hallöchen
hab gestern begonnen meinen Renderer neu zu gestalten, da mein Modelformat für statische Objekte eigentlich nur aus Ebenen besteht bieten sich ja
Raytracing effekte förmlich an. Um nun den Eintritts- bzw Austrittspunkt für ein Objekt zu bestimmen bräuchte ich da mal nen bissl Nachhilfe in Mathe da
ich leider vergessen habe wie man den Schnittpunkt zwischen Strahl und Ebene bestimmt :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Strahl schneidet Ebene
BeitragVerfasst: Mi Mär 09, 2011 11:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
*snip*
Code:
template<typename T>
inline T Plane<T>::distance(const Vector<T,3>& v) const
{
   return normalDot(v) + d;
}

template<typename T>
inline T Plane<T>::normalDot(const Vector<T,3>& v) const
{
   return a*v.x + b*v.y + c*v.z;
}

template<typename T>
inline Vector<T,3> Plane<T>::normal() const {
   return Vector<T,3>(a,b,c);
}

template<typename T>
inline Vector<T,3> Plane<T>::project(const Vector<T,3>& p) const
{
   return p + distance(p) * normal();
}

template<typename T>
inline Vector<T,3> Plane<T>::rayIntersect(const Vector<T,3>& p, const Vector<T,3>& r) const
{
   T scale = -distance(p) / dot(r, normal());
   return p + scale * r;
}


Oder in Kurzfassung und ohne Templates, inline-Funktionen, überladene Operatoren sowie andere Spielereien:
Code:
Vector3f Planef::rayIntersect(Vector3f p, Vector3f r)
{
   float scale = -(a*p.x + b*p.y + c*p.z + d) / (r.x*a + r.y*b + r.z*c);
   return Vector3f(
      p.x + scale*r.x,
      p.y + scale*r.y,
      p.z + scale*r.z
   );
}


In beiden Fällen wird die Ebene durch die Gleichung a*x + b*y + c*z + d = 0 bestimmt, wobei xyz ein Punkt im 3D-Raum und abcd die Parameter der Ebene sind. Die Ebene besteht aus allen Punkten bei denen die Gleichung erfüllt ist. Letztlich ist (a,b,c) eine Normale die senkrecht auf der Ebene steht und d eine Art Abstand vom Ursprung (0,0,0) in Richtung der Normale. Hat die Normale die Länge 1, ist d wirklich der echte euklidische Abstand.

Der Strahl wird hier durch einen Punkt p und einen Richtungsvektor r bestimmt.

Achtung: Für die obigen Funktionen muss die Ebene normalisiert sein, also die Normale muss die Länge 1 haben. Die Länge des r-Vektors ist dagegen egal, da sich diese sowieso aus der Gleichung raus kürzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Strahl schneidet Ebene
BeitragVerfasst: Mi Mär 09, 2011 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Coolcat hat geschrieben:
*snip*
Code:
[code]Vector3f Planef::rayIntersect(Vector3f p, Vector3f r)
{
   float scale = -(a*p.x + b*p.y + c*p.z + d) / (r.x*a + r.y*b + r.z*c);
   return Vector3f(
      p.x + scale*r.x,
      p.y + scale*r.y,
      p.z + scale*r.z
   );
}



danke mehr braucht ich wirklich nicht , mal schauen vieleicht find ich heut nach der Arbeit noch Zeit für ein paar Ergebnisse ^^

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]