Anströmwinkel / Angle of Attack

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Benibaerenstark

Betreff: Anströmwinkel / Angle of Attack

BeitragSo, Jan 06, 2008 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen

in meiner 3D-Flugsimulation möchte ich den Anströmwinkel der Tragflächen berechnen.

user posted image

Von der Strömungsgeschwindigkeit ist x,y- und z-Anteil bekannt (vx,vy,vz)
Vom der Tragfläche kenne ich leider nur die winkel (Pitch, Yaw, Roll)

Meine Fragen:
1.Wie rechne ich die Winkel in einen Vektor mit x,y und z-Anteil um? (im Beispiel ox, oy, oz genannt)
2.Wie berechne ich damit den Anströmwinkel?
-->Der Winkel zwischen den Beiden Vektoren(via Skalarprodukt) alleine genügt nicht, da die seitliche Drehung (Mausrad in folgender Demo) ja die anströmgeschwindigkeit beeinflusst.

Voila, die Demo, um das Ganze zu veranschaulichen:

die gelbe Linie ist der Geschwindigkeitsvektor, die Tragfläche bewegt sich also von rechts nach links.



Code: [AUSKLAPPEN]
gfxwidth=1024
gfxhight=768

Graphics3D gfxwidth, gfxhight,32, 1

cam =CreateCamera()
PositionEntity cam,-2,2,-5

light=CreateLight()
RotateEntity light,45,45,0


;Flügel erstellen
AP0=CreatePivot();-->Pivots für Schriftpositionierung
APX=CreatePivot(AP0)
APY=CreatePivot(AP0)
APZ=CreatePivot(AP0)
PositionEntity APX,5,0,0
PositionEntity APY,0,5,0
PositionEntity APZ,0,0,5
AXAchse=createline(0,0,0,5,0,0,0,AP0);-->Linien erstellen
AYAchse=createline(0,0,0,0,5,0,0,AP0)
AZAchse=createline(0,0,0,0,0,5,0,AP0)
EntityFX AXAchse, 17;-->Aus beiden Seiten sichtbar 16 und leuchtend 1
EntityFX AYAchse, 17
EntityFX AZAchse, 17
EntityColor AXAchse,255,0,0;-->Farbe wählen
EntityColor AYAchse,0,255,0
EntityColor AZAchse,0,0,255


AXSpitz = CreateCone (8,1,APX);-->Spitzen erstellen
AYSpitz = CreateCone (8,1,APY)
AZSpitz = CreateCone (8,1,APZ)
ScaleEntity AXSpitz,0.15,0.5,0.15;-->Grösse anpassen
ScaleEntity AYSpitz,0.15,0.5,0.15
ScaleEntity AZSpitz,0.15,0.5,0.15
EntityFX AXSpitz,1;leuchtend machen
EntityFX AYSpitz,1
EntityFX AZSpitz,1
EntityColor AXSpitz,255,0,0;-->Farbe anpassen
EntityColor AYSpitz,0,255,0
EntityColor AZSpitz,0,0,255
RotateEntity AXSpitz,0,0,-90;-->Ausrichten
RotateEntity AYSpitz,0,0,0
RotateEntity AZSpitz,90,0,0
ScaleEntity AP0,0.2,0.2,0.2


wing=CreateCube(AP0)
ScaleEntity wing,0.5,0.1,2



;geschwindigkeitsvektor (global)
vx#=-2
vy#=0
vz#=0

velocity=createline(0,0,0,vx,vy,vz,0,0)
EntityColor velocity,255,255,0
EntityFX velocity,17





While Not KeyHit(1)



;Ausrichtung entity (global)


   mxs#=mxs#+(MouseXSpeed()/5.0)
   mys#=mys#+(MouseYSpeed()/5.0)
   mzs#=mzs#+MouseZSpeed()
   RotateEntity AP0,-mys#,mzs#,-mxs#
   MoveMouse gfxwidth/2,gfxhight/2
 
   ;reset mit leertaste
    If KeyHit(57)
      mxs#=0
      mys#=0
      mzs#=0
    EndIf

 

 CameraClsMode(cam, 1, 1)
 WireFrame(0)
 RenderWorld()

 CameraClsMode(cam, 0, 0)
 WireFrame(1)
 RenderWorld()


 ;winkel zwischen Geschwindigkeits- und X-Vektor

  ;
  ;orientirungsvektor bestimmen (ob=Betrag=1):   wie geht das richtig??
   ob#=1

   ox#=ob*Cos(EntityRoll(AP0,1))   
   oy#=ob*Sin(EntityRoll(AP0,1))
   oz#=ob*Sin(EntityYaw(AP0,1))



  ;betrag vom geschwindigkeitsvektor:
    vb#=Sqr(vx^2+vy^2+vz^2)   

 
  ;Skalarprodukt 
   alpha#=ACos(((ox*vx)+(oy*vy)+(oz*vz))/(ob*vb))
 


 Text 0,0,"EntityPitch: "+EntityPitch(AP0,1)
 Text 0,15,"EntityYaw: "+EntityYaw(AP0,1)
 Text 0,30,"EntityRoll: "+EntityRoll(AP0,1)

 Text 0,50,"OX: "+ox
 Text 0,65,"OY: "+oy
 Text 0,80,"OZ: "+oz

 Text 0,100,"VBetrag: "+vb
 Text 0,120,"Winkel zwischen Geschwindigkeitsvektor und Orientierungsvektor: "+alpha

 Text 400,0,"Maus (inkl. Rad) um Flügel zu bewegen, Leertaste um Zurückzusetzten"

Flip
Wend
End



Function createline(x1#,y1#,z1#, x2#,y2#,z2#, mesh=0,parent=0)
   
   If mesh = 0 Then
      mesh=CreateMesh()
      EntityFX(mesh,16)
      surf=CreateSurface(mesh)   
      verts = 0   
   
      AddVertex surf,x1#,y1#,z1#,0,0
   Else
      surf = GetSurface(mesh,1)
      verts = CountVertices(surf)-1
   End If
   
   AddVertex surf,(x1#+x2#)/2,(y1#+y2#)/2,(z1#+z2#)/2,0,0
   ; you could skip creating the above vertex and change the line below to
   ; AddTriangle surf,verts,verts+1,verts+0
   ; so your line mesh would use less vertices, the drawback is that some videocards (like the matrox g400)
   ; aren't able to create a triangle with 2 vertices. so, it's your call :)
   AddVertex surf,x2#,y2#,z2#,1,0
   
   AddTriangle surf,verts,verts+2,verts+1
   
   EntityParent mesh,parent
   
   Return mesh
End Function



gruess beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Benibaerenstark

Betreff: 72 views, keine Antwort

BeitragMi, Jan 09, 2008 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Confused hm, 72 views und keine Antwort... ist das Problem zu kompliziert, oder habe ich die Fragen unklar gestellt? Habt ihr den Code Ausgeführt?

für Hilfe wäre ich sehr Dankbar

Gruss Beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jan 09, 2008 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist im grunde eine Berechnungsstufe einfacher als mein Problem mit den Rädern die auf ein Terrain kollidieren, da da noch ein Vektor hinzu kommt. Bei meinem Problem konnte mir auch keiner wirklich helfen. Dabei fragte ich insgesamt dreimal (im Zeitraum von insgesamt ~10 Monaten) hier im Forum.

Meine Antowort ist also: Ich weiß es nicht, aber vielleicht fällt mir noch was dazu ein.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragDo, Jan 10, 2008 1:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Winkel auf Vektor: Da fehlt leider deinerseits eine grundlegende Angabe: Winkel zu was?
Winkel zu den Achsen? Winkeln zu den Seitenebenen?
Im Raum benötigt man eigentlich nur 2 Winkel um einen Vektor von NormLänge zu erzeugen (siehe Kugel Koordinaten System). Ausgehend davon könntest du auch aus den Winkeln wieder den Vektor erzeugen indem du folgende Gleichungen umdrehst (oder Matheseiten / wikipedia befragst):

x = R * cos(alpha)*cos(beta)
y = R * cos(alpha)*sin(beta)
z = R* sin(alpha)

Alpha wird dabei von der Z Achse zum Vektor gemessen
Beta von der X Achse in der X-Y Ebene
R ist der Radius

Anzumerken ist, das in math: koordinatensystemen Z die Richtung nach oben ist, in Blitz ist jedoch Z in den Bildschirm hinein und Y nach oben.


Berechnen des Anströmwinkels -> winkel zwischen Wind und Normale

ScalarProdukt(VecA,VecB) = LängeA * LängeB * cos(alpha) und alpha ist der winkel zwischen den Vektoren.
Das umformen, winkel bestimmen und von 90° abziehen und du hast deinen Winkel.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Benibaerenstark

BeitragDo, Jan 10, 2008 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
danke erstmal für die Hinweise, allerdings klappt es immer noch nicht.


mit den Winkeln meinte ich EntityPitch, Yaw und Roll.


Wie kriege ich die "Normale" eines Entitys? Hier mein Versuch:

Code: [AUSKLAPPEN]



  ;
  ;Normale bestimmen (ob=Betrag=1):   wie geht das richtig??
   ob#=1

   ox#=ob*Cos(EntityPitch(AP0,1))*Cos(EntityYaw(AP0,1))
   oy#=ob*Cos(EntityPitch(AP0,1))*Sin(EntityYaw(AP0,1))
   oz#=ob*Sin(EntityPitch(AP0,1))



  ;betrag vom geschwindigkeitsvektor:
    vb#=Sqr(vx^2+vy^2+vz^2) 

 
  ;Skalarprodukt umgeformt:
 
   alpha#=ACos(((ox*vx)+(oy*vy)+(oz*vz))/(ob*vb));die x,y und z Anteile der beiden Vektoren werden multipiziert
                                      ;und durch das Produkt ihrer Beträge geteilt, Arcuscosinus liefert den Winkel



und hier nochmal der komplette Code zum Ausführen:



Code: [AUSKLAPPEN]
gfxwidth=1024
gfxhight=768

Graphics3D gfxwidth, gfxhight,32, 1

cam =CreateCamera()
PositionEntity cam,-2,2,-5

light=CreateLight()
RotateEntity light,45,45,0


;Flügel erstellen
AP0=CreatePivot();-->Pivots für Schriftpositionierung
APX=CreatePivot(AP0)
APY=CreatePivot(AP0)
APZ=CreatePivot(AP0)
PositionEntity APX,5,0,0
PositionEntity APY,0,5,0
PositionEntity APZ,0,0,5
AXAchse=createline(0,0,0,5,0,0,0,AP0);-->Linien erstellen
AYAchse=createline(0,0,0,0,5,0,0,AP0)
AZAchse=createline(0,0,0,0,0,5,0,AP0)
EntityFX AXAchse, 17;-->Aus beiden Seiten sichtbar 16 und leuchtend 1
EntityFX AYAchse, 17
EntityFX AZAchse, 17
EntityColor AXAchse,255,0,0;-->Farbe wählen
EntityColor AYAchse,0,255,0
EntityColor AZAchse,0,0,255


AXSpitz = CreateCone (8,1,APX);-->Spitzen erstellen
AYSpitz = CreateCone (8,1,APY)
AZSpitz = CreateCone (8,1,APZ)
ScaleEntity AXSpitz,0.15,0.5,0.15;-->Grösse anpassen
ScaleEntity AYSpitz,0.15,0.5,0.15
ScaleEntity AZSpitz,0.15,0.5,0.15
EntityFX AXSpitz,1;leuchtend machen
EntityFX AYSpitz,1
EntityFX AZSpitz,1
EntityColor AXSpitz,255,0,0;-->Farbe anpassen
EntityColor AYSpitz,0,255,0
EntityColor AZSpitz,0,0,255
RotateEntity AXSpitz,0,0,-90;-->Ausrichten
RotateEntity AYSpitz,0,0,0
RotateEntity AZSpitz,90,0,0
ScaleEntity AP0,0.2,0.2,0.2


wing=CreateCube(AP0)
ScaleEntity wing,0.5,0.1,2



;geschwindigkeitsvektor
vx#=-2
vy#=0
vz#=0

velocity=createline(0,0,0,vx,vy,vz,0,0)
EntityColor velocity,255,255,0
EntityFX velocity,17





While Not KeyHit(1)



;Ausrichtung entity (global)


   mxs#=mxs#+(MouseXSpeed()/5.0)
   mys#=mys#+(MouseYSpeed()/5.0)
   mzs#=mzs#+MouseZSpeed()
   RotateEntity AP0,-mys#,mzs#,-mxs#
   MoveMouse gfxwidth/2,gfxhight/2
 
   ;reset mit leertaste
    If KeyHit(57)
      mxs#=0
      mys#=0
      mzs#=0
    EndIf

 

 CameraClsMode(cam, 1, 1)
 WireFrame(0)
 RenderWorld()

 CameraClsMode(cam, 0, 0)
 WireFrame(1)
 RenderWorld()


 ;winkel zwischen Geschwindigkeits- und X-Vektor

  ;
  ;Normale bestimmen (ob=Betrag=1):   wie geht das richtig??
   ob#=1

   ox#=ob*Cos(EntityPitch(AP0,1))*Cos(EntityYaw(AP0,1))
   oy#=ob*Cos(EntityPitch(AP0,1))*Sin(EntityYaw(AP0,1))
   oz#=ob*Sin(EntityPitch(AP0,1))



  ;betrag vom geschwindigkeitsvektor:
    vb#=Sqr(vx^2+vy^2+vz^2) 

 
  ;Skalarprodukt umgeformt:
 
   alpha#=ACos(((ox*vx)+(oy*vy)+(oz*vz))/(ob*vb));die x,y und z Anteile der beiden Vektoren werden multipiziert
                                      ;und durch das Produkt ihrer Beträge geteilt, Arcuscosinus liefert den Winkel


 Text 0,0,"EntityPitch: "+EntityPitch(AP0,1)
 Text 0,15,"EntityYaw: "+EntityYaw(AP0,1)
 Text 0,30,"EntityRoll: "+EntityRoll(AP0,1)

 Text 0,50,"OX: "+ox
 Text 0,65,"OY: "+oy
 Text 0,80,"OZ: "+oz

 Text 0,100,"VBetrag: "+vb
 Text 0,120,"Winkel zwischen Geschwindigkeitsvektor und Orientierungsvektor: "+alpha

 Text 400,0,"Maus (inkl. Rad) um Flügel zu bewegen, Leertaste um Zurückzusetzten"

Flip
Wend
End



Function createline(x1#,y1#,z1#, x2#,y2#,z2#, mesh=0,parent=0)
   
   If mesh = 0 Then
      mesh=CreateMesh()
      EntityFX(mesh,16)
      surf=CreateSurface(mesh)   
      verts = 0   
   
      AddVertex surf,x1#,y1#,z1#,0,0
   Else
      surf = GetSurface(mesh,1)
      verts = CountVertices(surf)-1
   End If
   
   AddVertex surf,(x1#+x2#)/2,(y1#+y2#)/2,(z1#+z2#)/2,0,0
   ; you could skip creating the above vertex and change the line below to
   ; AddTriangle surf,verts,verts+1,verts+0
   ; so your line mesh would use less vertices, the drawback is that some videocards (like the matrox g400)
   ; aren't able to create a triangle with 2 vertices. so, it's your call :)
   AddVertex surf,x2#,y2#,z2#,1,0
   
   AddTriangle surf,verts,verts+2,verts+1
   
   EntityParent mesh,parent
   
   Return mesh
End Function
:

Danke für eure Hilfe
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group