#1 26.09.2006 13:16:22

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Winkel - Kugelreflektion

Hallo,

2D Problem:
Kugel ist also eigentlich ein Kreis. :mrgreen:

Also, Ich habe einen Kreis (Koordiaten und Radius) Und ich habe einen Strahl der auf diesen Kreis auftrifft. Von diesem Strahl hab ich nur die Richtung und die Position uf dem Kreis auf der er auftrifft. Jetzt möchte ich die refelktierte Richtung ausrechnen.
Sollte ja mit Tangente durch den Punkt + Einfallswinkel = Ausfallswinkel recht einfach zu berechnen gehen.

hier mein Versuch:

Code: delphi

  delta := arctan2((y-player1.y),(x-player1.x));
        
  angle := 2*delta - angle;

  x := x + sin(angle);
  y := y + cos(angle);



Delta is der Winkel Zwischen Kreisposition und StrahlPos.

Jedoch wird mein Strahl nur z.T reichtig reflektiert... Scheint ein Vorzeichenproblem zu sein oder so...

Hat jemand schonmal sowas gemacht?

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#2 26.09.2006 14:03:55

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Winkel - Kugelreflektion

Ich hätte einen anderen Ansatz gewählt, ich mag halt keine Winkel:

Hier (unten) eine Funktion die den Schnittpunkt von Kugel/Strahl berechnet. Wenn es keinen Schnittpunkt gibt, gibts auch keine Reflektion. Die Funktion nimmt überings an das der Radius der Kugel 1.0 ist. Den Schnittpunkt bekommst du dann über
Schnittpunkt = RayOrigin + t * RayVector

HalfVec = normalize(Schnittpunkt  - Kugelmittelpunkt)

Dann projezierst du deinen (negierten) Strahl senkrecht auf diesen drauf, das geht übers Dot-Produkt. (hab jetzt gerade keine Lust nachzugucken wie das nochma geht, ist aber ziemlich leicht)

HalfPoint = SphereOrigin + Projektionsvektor

ReflectOrigin = RayOrigin + 2 * (HalfPoint - RayOrigin) = 2 * HalfPoint - RayOrigin

ReflectVector = ReflectOrigin - SphereOrigin;

Oder? (habs jetzt nich nochmal nachgerechnet oder so)

Code: delphi

function rayintersectsphere( out t: single; const sphereorigin, rayorigin, rayvector: td3dxvector3 ): boolean;
var q: td3dxvector3;
    c, d, v: single;
begin
  d3dxvec3subtract( q, sphereorigin, rayorigin );
  c := d3dxvec3lengthsq( q );
  v := d3dxvec3dot( q, rayvector );
  d := 1 - (c - v*v);

  if (d < 0) then begin
    t := 0;
    result := false;
    exit;
  end;

  t := v - sqrt( d );
  result := true;
end;



Coolcat


My software never has bugs. It just develops random features.

Offline

 

#3 26.09.2006 15:10:19

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Winkel - Kugelreflektion

ICh bin eigentlich auch kein Wikelfan... Nur in 2D sind winkel irgendwie handlicher als Vektoren...

Hat jemand noch einen einen netten Ansatz ohne, dass ich gleich den ganzen DX Kram drauf oslassen muss? Die Math-Unit sollte doch eigentlich für soetwas reichen...

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#4 26.09.2006 18:45:08

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Winkel - Kugelreflektion

Mußt einfach den Reflectionvektor wie fürs Specular-Lighting berechnen. Deine Oberflächennormale ist in dem Fall Auftreffpunkt minus Kugelmittelpunkt, und Lichtrichtung ist Deine Strahlrichtung.

Ist einfach, denke ich. Vergiß die Winkel, bringen nur Ärger.

DerPeer

Offline

 

#5 26.09.2006 21:05:25

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Winkel - Kugelreflektion

@DerPeer: das ist doch genau das was ich da oben gemacht hab wink


My software never has bugs. It just develops random features.

Offline

 

#6 27.09.2006 06:01:23

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Winkel - Kugelreflektion

Hoppala. Habsch nett gelesen.

Also nochmal für Alle: Coolcat war Erster!  big_smile

DerPeer

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson