Mesh anhand 3-Raumkoordinaten ausrichten

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Mesh anhand 3-Raumkoordinaten ausrichten

BeitragSa, Dez 02, 2006 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 02, 2006 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Dez 02, 2006 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 02, 2006 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 03, 2006 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/upload/file.php?id=850

Meinst du vielleicht so etwas?
MFG Darren

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Dez 03, 2006 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Sad Falls jemand eine Idee dazu hat, dem währe ich sehr Dankbar.

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

BeitragMo, Dez 04, 2006 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Laughing
MFG Darren

biggicekey

BeitragMo, Jan 29, 2007 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Very Happy
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 03, 2007 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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-State

Betreff: Re: Mesh anhand 3-Raumkoordinaten ausrichten

BeitragMo, März 05, 2007 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 06, 2007 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 06, 2007 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, März 07, 2007 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, geil, Kreuzprodukt, heisst das. Danke man, du hast mich von viel, viel Kopfschmerzen befreit. Shocked Ich hatte es fast schon aufgegeben.

Jetzt nur noch einen berechneten Antriebsvektor aus einem Rad in beliebiger Stellung, und das ganze ist fertig. Very Happy Ich denke aber, dass deine Kreuzproduktberechnung da mir viel weiter helfen könnte.

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

BeitragMi, März 07, 2007 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 07, 2007 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Das hat dir Daren aber schon am 4. Dez hingeschrieben ...


Danke Dreamora. Cool

Habe mich schon gewundert, wo da jetzt eigentlich noch das Problem war Laughing
MFG Darren

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, März 07, 2007 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Rolling Eyes

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. Confused
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group