Jump to content
Unity Insider Forum

Richtung, von der ein Objekt getroffen wird


Life Is Good

Recommended Posts

Hey, wie ermittel ich am besten von welcher Seite ein Objekt mit meinem Ray getroffen wurde ?

 

Bitte nicht mit zig Collidern für jede Seite :D

 

Ich dachte soweit daran einfach die Richtung des Rays umzukehren, dass führt schonmal zu recht guten Ergebnissen gerundet, passt oft aber auch nicht, wenn ich beispielsweise ein Objekt an der Seite treffe, aber der Ray selbst von oben kommt.

Eine kleine Demonstration durch meine Paint Künste um es zu verdeutlichen :D

 

http://puu.sh/mgcqU/d721f3d430.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

mhhh ja, aber das müsste ich dann auch wieder für jede Seite prüfen was ich nicht so schön finde...

 

Ich dachte eher an einen normalisierten Vektor, der relativ zum getroffenen Objekt die Richtung beschreibt, die Frage ist bloß ob es da eine schöne, mathematische Lösung gibt oder ich wirklich jede Seite so prüfen muss ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit "Seite" meinst du also eine von sechs Seiten? Es hätten ja dann auch genauso gut 16 Seiten sein können :P

Darum, jede Seite zu überprüfen, wirst du nicht herum kommen, und zwar aus genau diesem Grund: Woher weiß die Mathematik, welche auch immer du verwendest, welche Seiten als Ergebnis in Frage kommen?

 

Du kannst also sowas machen:

var sides = new Vector3[6];
sides[0] = Vector3.forward;
sides[1] = Vector3.up;
//usw...

var relativeRayDirection = theObjectHit.transform.InverseTransformDirection(ray.direction);

var result = sides[0];
var resultAngle = Vector3.Angle(result, relativeRayDirection);
for(var i = 1; i < sides.Length; ++i)
{
 var angle = Vector3.Angle(sides[i], relativeRayDirection);
 if(angle < resultAngle)
 {
result = sides[i];
resultAngle = angle;
 }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meines Kenntnisstands nach kann DKDB das Lesen und verstehen, anstatt es zu kopieren ;)

 

Aber dennoch: relativeRayDirection ist der zurück transformierte Richtungsvektor des Rays. Man stelle sich vor, man dreht das getroffene Objekt auf (0,0,0) zurück und dreht den Ray einfach mit. Vergleiche ich danach mit Vector3.forward, ist es, als würde ich mit transform.forward vergleichen, da dann ja beides (0,0,1) ist.

 

Dann gibt's da das Array mit Vektoren. Jeder Vektor stellt ein mögliches Ergebnis da, also oben, unten, rechts, links usw. Oder welche Seiten man auch immer als Ergebnis akzeptiert.

Der Algorithmus geht jetzt davon aus, dass der erstbeste Vektor das Ergebnis ist.

var result = sides[0];

Danach geht er mit einer Schleife über alle anderen Vektoren und schaut, ob nicht doch ein anderer näher dran ist. Wird ein Vektor mit kleinerem Winkel zur relativeRayDirection gefunden, wird dieser als Ergebnis gesetzt. Welcher Vektor dann am Ende in result steht, ist der Vektor, der den kleinsten Winkel zu relativeRayDirection hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aus dem ersten Post kann man entnehmen, dass das Objekt nicht die Außenform hat, um die es bei dem Problem geht. Vermutlich ein Objekt mit komplexem Collider, aber gefragt ist, ob das Objekt von "oben" oder "rechts" getroffen wurde. Hätte das Objekt einen Box Collider, würde die Frage vermutlich nicht in der Form aufkommen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, ich verstehe den Code, ist ja jetzt auch nicht so viel :D

 

Vielleicht mal eine etwas genauere Ausführung. Ich schreibe an einer Marching Cubes basierenden Voxel Engine, d.h. letztendlich arbeite ich natürlich mit cubes (die "voxels"), das mesh selbst wird aber selten die Bedingungen eines Würfels erfüllen,vielleicht ein paar Screens zum besseren Verständnis ->

 

Das wäre z.B. ein Konstrukt was ziemlich vom Würfel und sonstigen vergleichbaren Formen abweicht,

http://puu.sh/mi8pu/890b51c8ed.jpg

http://puu.sh/mi8E6/f591f82ac5.jpg

 

Bei der Generierung des Meshs lasse ich übrigens einen Smooth Algorithmus laufen, der die Voxel nocheinmal aufeinander abgleicht, und dann natürlich darauf die Normals neuberechnet. Bei Zerstörung / Bebauung selbst wird nicht nochmal gesmootht. Anders gesagt, die Formen, die das Mesh annehmen könnte unterscheiden sich also wieder zwischen voxeln, die gesmootht wurden, und denen, die es nicht werden.

 

Ansonsten, vielen Dank ! :)

Woher weiß die Mathematik, welche auch immer du verwendest, welche Seiten als Ergebnis in Frage kommen?

Das leuchtet natürlich ein.

 

Alle Seiten zu prüfen Ist jetzt auch nicht so tragisch, letztendlich kann ich es ja tatsächlich auf 6 Seiten begrenzen, das Mesh selbst wird aber eben so gut wie nie so eine Form annehmen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...