Mesh anhand 3-Raumkoordinaten ausrichten
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Mesh anhand 3-Raumkoordinaten ausrichten |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie der Titel schon sagt, möchte ich ein Mesh anhand 3 Punkten (Pivot) ausrichten. Aber wie?
Mein erster Grundgedanke war: Man setzt den Meshursprung auf eine Ecke und positioniert ihn an Punkt 1. Dann mit PointEntity den zweiten Punkt anpeilen und am Ende in der Z-Achse drehen, bis die X-Achse in Richtung Punkt 3 zeigt. Nur geht es nicht, wenn sich das Mesh in alle Richtungen über 180° drehen soll... Warum das ganze? Ich möchte eine 3D-Carphysik-Funktion schreiben, die auch ein fertiges Mesh positioniert wie im Codearchiv [B3D Physik-Buggy in 3D]. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die 3 Punkte bilden eine Ebene.
wenn du für die Positionsvektoren v0, v1, v2 annimmst, so hättest du folgende Daten: Position: v0 Normale (also Y Richtung des Models für Align to Vector) (v0-v1) x (v0 - v2) Die Ausrichtung in der Ebene kannst du damit leider nicht bestimmen, da du ja nur die Position und die Ausrichtung der Ebene hast mit den 3 Punkten. Wenn du aber weisst in welche Richtung das Fahrzeug sich bewegt (Winkel um die Y Achse), kannst du nach den beiden oberen Daten einfach noch eine Rotation um die Y Achse hinzufügen und das wars ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, mir kommt es aber genau darauf an. Ich will ja, wenn mein Fahrzeug auf dem Dach liegt, es so auch gezeichnet wird. Egal wie die drei Punkte liegen, soll das Mesh ausgerichtet werden.
Werde weiter ein bischen rumtüffteln müssen. Um jetzt mal auf dem Code [Buggy in 3D] zu kommen. Soll ein KnotenPunkt pro Reifen erstellt werden. Daher muß ich dann genau das gleiche auch auf die Reifen anwenden (Seitenführung auf jeglichem Gelände (auch Steilfahrten) etc.). Wenn es klappt, dann hätte man ein sehr schönes physikalisches Verhalten für jede Menge an möglichen Spielen. Die Driver-Demo konnte mich bisher noch nie begeistern, da genau das Problem dort durch eine Notlösung umgangen wurde... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nun, irgend eine besondere Eigenschaft / Zusammenhang müssen deine 3 Punkte haben, oder? Wenn nicht ist obiges alles was möglich ist. Die Ebene bestimmen welche die Grundebene und damit "oben" festlegt. Es gibt keine möglichkeit eine Ausrichtung in dieser Grundebene zu berechnen.
Bei einem Wagen hast du ja eigentlich 4 (die Räder), damit kannst du alle Dinge problemlos errechnen. (Richtung ist durch vRadVorneLinks - vRadHintenLinks definiert zb) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Darren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
https://www.blitzforum.de/upload/file.php?id=850
Meinst du vielleicht so etwas? |
||
MFG Darren |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Darren, genau das meine ich! Nur lässt sich das unter B3D anscheinend nur schlecht realisieren, oder ich hab ein Brett vorm Kopf. Mein Codebeispiel sieht komischer Weise ziemlich ähnlich aus. Ich habe bereits folgendes ausporobiert:
- PointEntity in Verbindung mit TurnEntity - AlignToVector in Verbindung mit TurnEntity - TurnEntity berechnet mit ACos/ASin/ATan aus VertexNX/NY/NZ, wo ich zuvor aus allen drei Punkten ein Triangle erstellt habe - RotateEntity berechnet mit VectorPitch/VectorYaw - RotateEntity mit nachträglichem TurnEntity - Und vielles mehr, was ich nicht noch aufzählen möchte Alle Beispiele geben mir das Problem, dass bei einem Winkel von unter -180° und über 180° sich das Mesh dreht und der eigendlich unten liegende Bereich dann wieder nach oben 'flipt'... Selbst das auslesen der VertexNX/NY/NZ ergeben das gleiche Problem. Dabei will ich doch nur mein Mesh ausrichten. Ein Triangle wird ja auch richtig rum dargestellt, nur kann ich keine Winkel direkt auslesen, ich muß immer erst diese durch Funktionen ausrechnen, wo dann der 'Fehler' wieder auftritt... Macht mich echt fertig das ganze. Vielleicht ginge es, wenn man auf die Matrix direkt zugreifen könnte. Aber auch hier lässt GetMatElement nur das auslesen der Werte zu. ![]() edit1: Gibt es eine Möglichkeit, ein Entity nicht relativ zu sich selbst, sondern relativ zur Welt zu drehen? Dann könnte ich das Problem auch mathematisch lösen. Als Beispiel: Nicht MoveEntity sondern TranslateEntity. So auch: Nicht TurnEntity sondern TranslateTurnEntity? |
||
Darren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich denke, dass dein Problem die richtung der x-Achse ist(bei meinem Screen rot). Um diesen vector zu erhalten musst du das Kreuzprodukt aus den anderen zweien bilden. Diese sollten ja leicht zu errechnen sein. Wenn du alle 3 Vectoren hast, sollte es ja auch nichtmehr so schwierig sein, dein Mesh richtig zu drehen oder? Hab aber keinen Plan von der Mathematik, die dahintersteckt. Ich hab jeglich einmal in C4D eine Expressoschaltung gebaut, die mir genau das macht. ![]() |
||
MFG Darren |
![]() |
biggicekey |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich werfe hier jetzt einfach mal die "TFORM" Befehle in den Raum weil ich die in deinen Versuchen nicht gesehen habe. Und ich weiß das man TFORMPOINT/TFORMVECTOR/TFORMNORMAL oft mal übersieht.
Dein Problem kann ich zu so später Stunde mir nicht genauer durch den Kopf gehen lassen aber spontan bin ich auf TFORM gekommen die mir öfters im Ausrichten zu irgendwelchen Punkten geholfen haben. ![]() |
||
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller Nothing more to register - you've cleaned us out![/size] |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo biggicekey, mit den TForm... hast du natürlich Recht. Ich vergesse auch oft den Nutzen dieser Funktionen, nur habe ich es mit diesen nicht geschafft. Um das ganze nochmal zu verdeutlichen und um zu zeigen, dass ich nicht ganz 'untätig' hinter dieser Sache her gehe, hier mal ein Code: [AUSKLAPPEN] ;Grafikkramm
Const gfx=1280 Const gfy=gfx*.75 Const ghx=gfx/2 Const ghy=gfy/2 Graphics3D gfx,gfy,32,1 SetBuffer BackBuffer() ;Kamera erstellen mitte=CreatePivot() camera=CreateCamera() PositionEntity camera,0,4,-4 CameraClsColor camera,48,48,48 ;Licht erstellen light=CreateLight() RotateEntity light,60,-60,0 ;Raum erstellen room=CreateCube() EntityColor room,24,24,24 ScaleEntity room,10,10,10 FlipMesh room ;Punkte erstellen Dim p(3) p(0)=CreateSphere(8) ;Fokus p(1)=CreateSphere(8) ;Punkt-1-Rot p(2)=CreateSphere(8) ;Punkt-2-Grün p(3)=CreateSphere(8) ;Punkt-3-Blau EntityColor p(0),0,0,0 EntityColor p(1),240,60,60 EntityColor p(2),60,240,60 EntityColor p(3),60,60,240 ScaleEntity p(0),.2,.2,.2 ScaleEntity p(1),.1,.1,.1 ScaleEntity p(2),.1,.1,.1 ScaleEntity p(3),.1,.1,.1 PositionEntity p(1),2,0,-1 PositionEntity p(2),-2,0,-1 PositionEntity p(3),2,0,1 EntityAlpha p(0),.5 ;Pfeile erstellen Dim m(3) Dim f(3) m(1)=CreateMesh() brush=CreateBrush() face=CreateSurface(m(1),brush) v0=AddVertex(face,-.4,0,0) v1=AddVertex(face,0,0,2) v2=AddVertex(face,.4,0,0) w0=AddVertex(face,0,.001,0) w1=AddVertex(face,0,0,2) w2=AddVertex(face,0,.6,0) VertexColor face,w0,0,0,0 VertexColor face,w2,0,0,0 AddTriangle face,v0,v1,v2 AddTriangle face,w0,w1,w2 ScaleMesh m(1),2,.5,.5 UpdateNormals m(1) EntityFX m(1),16 m(2)=CopyEntity(m(1)) m(3)=CopyEntity(m(1)) EntityColor m(1),120,30,30 EntityColor m(2),30,120,30 EntityColor m(3),30,30,120 ;Dreieck erstellen mde=CreateMesh() fde=CreateSurface(mde,brush) v0=AddVertex(fde,0,0,0) v1=AddVertex(fde,0,0,0) v2=AddVertex(fde,0,0,0) AddTriangle fde,v0,v1,v2 EntityColor mde,120,120,120 UpdateNormals mde EntityAlpha mde,.5 EntityFX mde,20 pos=1 ;Position Fokus ds#=0 ;Distanz wk#=0 ;Winkel mx#=0 ;X-Maus my#=0 ;Y-Maus ;HAUPTSCHLEIFE While Not KeyHit(1) ;Abschnitt für Kamera mx=mx+MouseXSpeed()/40.0:mx=mx/2.5 my=my-MouseYSpeed()/40.0:my=my/2.5 If EntityPitch(camera)<-88 my=.01 If EntityPitch(camera)>88 my=-.01 ds=(EntityDistance(camera,mitte))-6-MouseZ() MoveEntity camera,mx,my,ds PointEntity camera,mitte MoveMouse ghx,ghy If KeyHit(2) pos=1 If KeyHit(3) pos=2 If KeyHit(4) pos=3 ;Abschnitt für Verschiebung If KeyDown(30) MoveEntity p(pos),+.02,0,0 If KeyDown(44) MoveEntity p(pos),-.02,0,0 If KeyDown(31) MoveEntity p(pos),0,+.02,0 If KeyDown(45) MoveEntity p(pos),0,-.02,0 If KeyDown(32) MoveEntity p(pos),0,0,+.02 If KeyDown(46) MoveEntity p(pos),0,0,-.02 ;Abschnitt für Positionierung PositionEntity p(0),EntityX(p(pos)),EntityY(p(pos)),EntityZ(p(pos)) PositionEntity m(1),EntityX(p(1)),EntityY(p(1)),EntityZ(p(1)) PositionEntity m(2),EntityX(p(2)),EntityY(p(2)),EntityZ(p(2)) PositionEntity m(3),EntityX(p(3)),EntityY(p(3)),EntityZ(p(3)) VertexCoords fde,v0,EntityX(p(1)),EntityY(p(1)),EntityZ(p(1)) VertexCoords fde,v1,EntityX(p(2)),EntityY(p(2)),EntityZ(p(2)) VertexCoords fde,v2,EntityX(p(3)),EntityY(p(3)),EntityZ(p(3)) ;Ab hier kommt die Ausrichtung ; m(1) rot ; m(2) grün ; m(3) blau PointEntity m(1),m(2) ; rot zeig auf grün PointEntity m(2),m(3) ; grün zeigt auf blau PointEntity m(3),m(1) ; blau zeigt auf rot TurnEntity m(1),0,0,VectorPitch(EntityX(m(1))-EntityX(m(3)),EntityY(m(1))-EntityY(m(3)),EntityZ(m(1))-EntityZ(m(3))) TurnEntity m(2),0,0,VectorPitch(EntityX(m(2))-EntityX(m(1)),EntityY(m(2))-EntityY(m(1)),EntityZ(m(2))-EntityZ(m(1))) TurnEntity m(3),0,0,VectorPitch(EntityX(m(3))-EntityX(m(2)),EntityY(m(3))-EntityY(m(2)),EntityZ(m(3))-EntityZ(m(2))) RenderWorld Flip Wend End Zu sehen sind drei Pfeile in rot, grün und blau. Jedes einzelne kann mit den Tasten 1, 2 und 3 anfokussiert werden. Mit den Tasten a/y ändert man die X-Achse des fokussiertem Objektes. Mit den Tasten s/x ändert man die Y-Achse und d/c die Z-Achse. Mit der Maus kann man die Kamera umpositionieren und mit dem Mausrad näher/weg -Zoomen. Was ich will ist, dass jede Spitze (oder zumindest nur die rote Spitze) zum jeweils nächstem Vornachbarn zeigt und der rechte Seitenflügel genau auf den jeweiligen Nebennachbarn zeigt. Um die genaus Ausrichtung nicht immer wieder mit der Kamera anpielen zu müssen, habe ich ein transparentes Triangle zwischen alle Punkte zeichnen lassen. Wenn die Flügel der Pfeile an diesem Triangle 'flimmern' so ist der Winkel genau ausgerichtet. Langsam bringt mich das ganze hier zum verzweifeln. Es muss doch irgendwie gehen. Lustiger weise steht in der deutschen OH unter DeltaYaw/Pitch Code: [AUSKLAPPEN] ...DELTAPITCH liefert einen Drehwinkel für die X-Achse. Die zweite Funktion DELTAYAW berechnet einen Drehwinkel für die Y-Achse. Eine dritte Funktion für die Z-Achse ist nicht notwendig!
Arghhhhhhh!!! Ich brauche aber ein DeltaRoll denn es nicht gibt, weil es ja nicht notwendig ist... Grrrr... |
||
![]() |
Terror-StateBetreff: Re: Mesh anhand 3-Raumkoordinaten ausrichten |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Meister! Falls das Problem noch existiert könnt ich dir da weiterhelfen. Bzw wir uns gegenseitig!
Müsstest dich nur mal melden! Beste grüße von TS |
||
Ob friedlich oder militant, wichtig ist der Widerstand |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich schlage mich seit einiger Zeit auch mit Bewegungen in 3D Raum herum.
Es gibt da eine Sache, die sich in meinem Code schon mehrmals als potentielle, ewige Fehlerquelle erwiesen hatte. Was oft übersehen wird ist, daß manche Befehle wie zum Beispiel EntityY auch noch eine selten benutzte 2. Parameter haben, das bestimmt, ob die Koordinatenwerte relativ zum parent Entity oder zu den absoluten, echten 3D Raum Koordinaten sein sollen. (Achtung ! In der beliebten und sonst sehr guten Blitzbase de Seite wird das fehlerhaft erklärt. Ich habe darauf bereist hingewiesen.) Check mal dein Code mit dieser Sache im Kopf auf mögliche Ungereimtheiten ! |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit AlignToVector brauchst Du eigentlich nur die Y-Achse an der Flächennormalen ausrichten und schon liegt das Entity auf der Fläche.
Welche Mathematik genau hinter AlignToVector steht würde mich aber auch sehr interessieren... Hier für Dein Beispiel, einfach anstelle der TurnEntity-Befehle einsetzen: Code: [AUSKLAPPEN] ;Normalenvektor der Fläche ermitteln(Kreuzprodukt der aufspannenden Vektoren) ;Vektor 1 lx# = EntityX#(m(1)) - EntityX#(m(2)) ly# = EntityY#(m(1)) - EntityY#(m(2)) lz# = EntityZ#(m(1)) - EntityZ#(m(2)) ;Vektor 2 ax# = EntityX#(m(2)) - EntityX#(m(3)) ay# = EntityY#(m(2)) - EntityY#(m(3)) az# = EntityZ#(m(2)) - EntityZ#(m(3)) ;Kreuzprodukt nx# = (ly# * az#)-(lz# * ay#) ny# = (lz# * ax#)-(lx# * az#) nz# = (lx# * ay#)-(ly# * ax#) ;Y-Achse der Entities entlang Normale ausrichten AlignToVector m(1), nx#, ny#, nz#, 2 AlignToVector m(2), nx#, ny#, nz#, 2 AlignToVector m(3), nx#, ny#, nz#, 2 |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wow, geil, Kreuzprodukt, heisst das. Danke man, du hast mich von viel, viel Kopfschmerzen befreit. ![]() Jetzt nur noch einen berechneten Antriebsvektor aus einem Rad in beliebiger Stellung, und das ganze ist fertig. ![]() Danke auch an Terror-State der mir per ICQ eine andere Möglichkeit gezeigt hatte, die aber leider noch etwas unvollständig war, und somit ohne weiterer Bearbeitung nicht lauffähig gewesen währe. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das hat dir Daren aber schon am 4. Dez hingeschrieben ... | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Darren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dreamora hat Folgendes geschrieben: Das hat dir Daren aber schon am 4. Dez hingeschrieben ...
Danke Dreamora. ![]() Habe mich schon gewundert, wo da jetzt eigentlich noch das Problem war ![]() |
||
MFG Darren |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schön, schön... es ist einfach, wenn man was vorgekaut bekommt, aber schwer wenn man es selber erarbeiten muß. Keiner hat mir zuvor wirklich zur Lösung beitragen können. Es hies hier und da, man könnte es so oder so machen aber Plan hab ich keinen von. jetzt sind alle wieder gaaanz schlau. ![]() Kreuzprodukt kannte ich nicht und habe damit nichts weiter anfangen können, sorry. Über http://de.wikipedia.org/wiki/Kreuzprodukt wird man auch nicht schlau von. Was nützt mir eine Papierlösung zur Lösung eines Bildschirmproblemes, wenn es sowas wie ein GlobalTurnEntity nicht gibt? Ich habe es zumindest damit nicht geschaft und bin BIG BUG sehr dankbar für seine Lösung meines Problemes. Es nervt mich etwas, dass die letzten fünf Fragen die ich in den letzten Jahren gestellt habe, jetzt mal eine beantwortet werden konnte. Und ich gehöre nicht zu dennen, die jeden Codeschnippsel für sich behalten, sondern gerne Wissen weiter verbreiten. ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group