Hälp! Brauche kurz Nachhilfe in Sachen 'Normale'

Übersicht BlitzBasic Blitz3D

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

x-pressive

BeitragMi, Feb 18, 2004 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Shodan hat Folgendes geschrieben:
zu deinem Problem mit PositionMesh ist zu sagen, das du das DummyMesh ebenfalls mit RotateMesh ausrichten must, nicht mit AlignToVector


Das Problem ist hier aber: wie Berechne ich Pitch, Yaw und Roll bei RotateMesh(), damit das Dummy Mesh genau so ausgerichtet wird, wie das Sprite (also mit der Flugbahn des Sprite-Geschosses als Z-Achse)?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Shodan

BeitragMi, Feb 18, 2004 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Lösung müsste wie folgt aussehen (das Bsp. ist nur angedeutet):

Code: [AUSKLAPPEN]

c=countcollisions(geschoss)
if c>0
 nx#=CollisionNX# (geschoss,1)
 ny#=CollisionNy# (geschoss,1)
 nz#=CollisionNz# (geschoss,1)

 cx#=CollisionX# (geschoss,1)
 cy#=Collisiony# (geschoss,1)
 cz#=Collisionz# (geschoss,1)
 dummy=createpivot()
 aligntovector dummy,nx,ny,nz,3
  rx=entitypitch(dummy) : ry=entityyaw(dummy) : rz=entityroll(dummy)
 freeentity dummy
endif

der dummy wird entlang seiner z-achse auf die kollisions-normale ausgerichtet, und dann seine Ausrichtung abgefragt. Danach brauchen wir ihn nicht mehr.
damit steht die Pos.,Ausrichtung und Normale der Kollision zur Verfügung
diese kannst du nun an dein DummyMesh übergeben mit RotateMesh und PositionMesh.

x-pressive

BeitragDo, Feb 19, 2004 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, so sieht mittlerweile der Code zum Erzeugen, Positionieren und Ausrichten eines Quads an der Einschussstelle aus (alles weitere baut ja darauf auf, wird also erst interessant, wenn DAS mal funktioniert):

sx = Breite des Quads
sy = Höhe des Quads
Sprite = Das kollidierte Sprite-Geschoss

Code: [AUSKLAPPEN]
   ;KOORDINATEN & SCHUSSRICHTUNG
   x#  = CollisionX (Sprite,1)
   y#  = CollisionY (Sprite,1)
   z#  = CollisionZ (Sprite,1)
   nx# = CollisionNX(Sprite,1)
   ny# = CollisionNY(Sprite,1)
   nz# = CollisionNZ(Sprite,1)
   
   ;QUAD ERZEUGEN
   DummyMesh = CreateMesh()
   DummySurf = CreateSurface(DummyMesh)
   
   v1% = AddVertex  (DummySurf,-sx, sy,0)
   v2% = AddVertex  (DummySurf, sx, sy,0)
   v3% = AddVertex  (DummySurf,-sx,-sy,0)
   v4% = AddVertex  (DummySurf, sx,-sy,0)
   t1% = AddTriangle(DummySurf,v1,v2,v3)
   t2% = AddTriangle(DummySurf,v2,v4,v3)
   
   ;MESH MIT QUAD PLAZIEREN & AUSRICHTEN
   DummyPiv = CreatePivot()
   AlignToVector DummyPiv,nx,ny,nz,3
   rx# = EntityPitch(DummyPiv)
   ry# = EntityYaw  (DummyPiv)
   rz# = EntityRoll (DummyPiv)
   FreeEntity DummyPiv
   
   PositionMesh DummyMesh,x,y,z
   RotateMesh   DummyMesh,rx,ry,rz


Leider funktioniert das nicht. Die Quads hängen, wenn ich z.B. parallel zum Bode schiesse, fast 'zufällig' angeordnet im Himmel herum -auch die Ausrichtung stimmt nicht. Es ist zum Verzweifeln.

Wenn ich das Mesh mit dem Quad darin als Entity behandle und wie im ersten Code ganz oben mit AlignToVector Mesh... und PositionEntity Mesh... positioniere, haut das hin -aber dann sitzen die Punkte des Quads eben nicht mehr an 'globalen' Koordinaten. Könnte ich nicht dennoch, egal wie das QuadMesh selbst ausgerichtet ist, die Punkte des Quads darin mit TFormPoint() wieder in das globale System konvertieren? Dann wäre es doch egal, wie man mit dem Mesh herumspielt, da man mit TFormPoint() immer wieder in globale Koordinaten umrechnen kann, oder?

Ich weiß gar nicht, wie viele Kombinationen ich schon ausprobiert habe, Achsen bei AlignToVector ausgetauscht, und, und, und... -Blitz macht einfach, was es will, Logik hin oder her Crying or Very sad

Vielleicht liegt's aber auch speziell an meinem Gamecode. Wenn jemand diese Nuss knacken möchte, könnte ich ihm das Projekt per Email schicken. Mich hält das jetzt schon über eine Woche auf Trab...
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Jan_

Ehemaliger Admin

BeitragDo, Feb 19, 2004 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
SChon mal das angesehen:

http://www.blitz3d.co.uk/index...spdemo.zip

???

Weiß nicht, ob du das schon kennst.
between angels and insects

x-pressive

BeitragDo, Feb 19, 2004 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber hier werden eben nur Sprites an die Wand geklebt. Das geht auch, wenn die Einschusslöcher recht klein sein. Dann fällt es gar nicht auf, wenn sie irgendwo überstehen. In meinem Game schiesse ich aber z.B. mit einer ziemlich wuchtigen Kanone, da müssen die Einschusslöcher um einiges grösser sein -und das Terrain ist auch nicht so gerade und geometrisch, sondern zerklüftet. Deshalb sieht das übel aus, wenn die Decals überstehen. Deshalb versuche ich, die Dinger irgendwie an die Oberfläche zu 'heften'.

Wenn Blitz auf die einzelnen Vertices eines Sprites zugreifen könnte, wäre es einfacher: dann könnte ich, wie in der BSPDemo, einfach ein Sprite an die Stelle kleben, ausrichten, und dessen Vertices dann in ein Mesh umkopieren.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Shodan

BeitragFr, Feb 20, 2004 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiss jetzt nicht, ob du ein Blitz-Terrain verwendest als Boden, aber vieleicht solltest du versuchen die Triangles im bereich des Treffers in ein neues Mesh zu kopieren, dieses ein klein wenig vom Boden abheben und mit ner maskierten textur versehen, in die der einschuss gezeichnet ist.
das Triangle, das getroffen wurde lässt sich ermitteln. man müsste nur noch die angrenzenden triangles heraussuchen.
keine Ahnung ob das funzt. ist nur so ne idee Rolling Eyes

x-pressive

BeitragFr, Feb 20, 2004 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist zwar eine gute Idee Idea , aber da das Terrain ziemlich zerklüftet ist, sind einige Triangles eben ziemlich deformiert bzw. langgezogen. Die Einschlagslöcher würden wahrscheinlich zu unterschiedlich aussehen -mal langgestreckt, dann wieder grösser, kleiner, etc. Ausserdem dachte ich daran, eine möglichst universelle Lösung hinzukriegen, bei der es eigentlich egal ist, auf welchem Objekt die Schüsse auftreffen. Da einzige, das man bräuchte, wären eben die Koordinaten des Schusses, die Flugrichtung und ein pickbares Zielobjekt.

Das kann doch nicht unmöglich sein -ich habe schon einige Codes gefunden, in denen z.B. auf diese Art ein Schattenmesh auf den Boden gepickt wird, das sich diesem anpasst. Der einzige Unterschied ist eben, das ich in meinem Fall dieses 'Schattengitter' nicht von oben nach unten picken müsste, sondern vom 'Blickwinkel' des Schusses aus in Flugrichtung.

Hier z.B. ein Cut & Paste Code, der ein Schattenmesh auf mehrere Objekte wirft und es diesen anpasst (allerdings nur von oben nach unten):

Code: [AUSKLAPPEN]

; Flexible Towel Shadows By Rob Cummings (rob@redflame.net),
; CreateFace function & assistance by David Bird
;
; Rough code here. Use for cloth sims,
; lights And shadows. Have fun! Load own image for fun or
; even use a character mesh as the Flex...

AppTitle "Flexible Towel Shadows in Blitz3D"
HidePointer
Global camera,light,world,Flex,mx#,my#,ball,w
;setup graphics and scene
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
camera=CreateCamera()
CameraRange camera,1,1600
MoveEntity camera,500,800,500
light=CreateLight(2)
MoveEntity light,0,400,400
LightRange light,350
AmbientLight 50,50,50

;make test world
world=createworld()

;make shadow
Flex=CreateFlex()

;make shadow texture
t=CreateTexture(32,32,48+2)
SetBuffer TextureBuffer(t)
Color 255,255,255:Rect 0,0,32,32,1

For i=0 To 31
   col=(255-(i*8))
   pos=(i/2)
   wid=31-i
   Color col,col,col
   Oval pos,pos,wid,wid,1
Next
Color 255,255,255
EntityTexture Flex,t
EntityFX Flex,1
EntityBlend Flex,2

;hack
whitetexture=CreateTexture(32,32)


;make ball
ball=CreateSphere()
EntityColor ball,255,0,0
EntityShininess ball,1
ScaleEntity ball,50,50,50
MoveEntity ball,0,300,0
TurnEntity ball,0,-45,0

;misc
PointEntity camera,world
SetBuffer BackBuffer()

;mainloop
While Not KeyHit(1)
   If KeyHit(17)
       w=1-w
      WireFrame w
      ;visibility hack for you to test
      If w=1
         EntityBlend Flex,1
      Else
         EntityBlend Flex,2
      EndIf
   EndIf
   
   mx#=MouseXSpeed()*0.5
   my#=MouseYSpeed()*0.5
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   MoveEntity ball,-mx,0,my
   
   ;UpdateFlex(target deformable mesh (try a model!!),mesh that casts shadow)
   UpdateFlex(Flex,ball)
   UpdateWorld
   RenderWorld
   Text 0,0,"Use mouse to move ball, watch the shadow!"
   Text 0,16,"press 'w' to toggle wireframe mode, ESC to quit."
   Flip
Wend
End

;load your own level? but make it pickable.
Function CreateWorld()
   p=CreatePivot()
   a=CreateCube(p)
   FitMesh a,-500,0,-500,1000,10,1000
   a=CreateCube(p)
   FitMesh a,-200,10,-200,400,40,400
   a=CreateSphere(8,p)
   ScaleEntity a,100,100,100
   MoveEntity a,-200,0,-200
   a=CreateSphere(8,p)
   ScaleEntity a,100,100,100
   MoveEntity a,200,0,-200
   a=CreateSphere(8,p)
   ScaleEntity a,100,100,100
   MoveEntity a,200,0,200
   a=CreateSphere(8,p)
   ScaleEntity a,100,100,100
   MoveEntity a,-200,0,200
   
   For i=1 To CountChildren(p)
      EntityPickMode GetChild(p,i),2
   Next
   
   Return p
End Function

Function CreateFlex()
   m=CreateFace(8) ;segs
   ScaleEntity m,250,250,250
   Return m
End Function

Function UpdateFlex(flexmesh,source)
   x#=EntityX(source):y#=EntityY(source):z#=EntityZ(source)
   PositionEntity flexmesh,x,y,z

   ;you can optimise by precalculating x and z
   s=GetSurface(flexmesh,1)
   For i=0 To CountVertices(s)-1

      vx#=VertexX(s,i)
      vy#=0
      vz#=VertexZ(s,i)

      TFormPoint vx,vy,vz,flexmesh,0
      vx=TFormedX() : vy=TFormedY() : vz=TFormedZ()
      
      LinePick vx,vy,vz,vx,vy-9000,vz
      vy=PickedY()+50
      
      TFormPoint vx,vy,vz,0,flexmesh
      vx=TFormedX() : vy=TFormedY() : vz=TFormedZ()
      
      VertexCoords s,i,vx,vy,vz
      
   Next
   
End Function


;Creates a single sided face
;segmented
Function CreateFace(segs=1,double=False,parent=0)
   mesh=CreateMesh( parent )
   surf=CreateSurface( mesh )
   stx#=-.5
   sty#=stx
   stp#=Float(1)/Float(segs)
   y#=sty
   For a=0 To segs
      x#=stx
      v#=a/Float(segs)
      For b=0 To segs
         u#=b/Float(segs)
         AddVertex(surf,x,0,y,u,v) ; swap these for a different start orientation
         x=x+stp
      Next
      y=y+stp
   Next
   For a=0 To segs-1
      For b=0 To segs-1
         v0=a*(segs+1)+b:v1=v0+1
         v2=(a+1)*(segs+1)+b+1:v3=v2-1
         AddTriangle( surf,v0,v2,v1 )
         AddTriangle( surf,v0,v3,v2 )
      Next
   Next
   UpdateNormals mesh
   If double=True Then EntityFX mesh,16
   Return mesh
End Function
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Shodan

BeitragFr, Feb 20, 2004 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Der einzige Unterschied ist eben, das ich in meinem Fall dieses 'Schattengitter' nicht von oben nach unten picken müsste, sondern vom 'Blickwinkel' des Schusses aus in Flugrichtung.


Wieso eigentlich. wenn du dein Mesh aus der Blickrichtung des Schusses pickst, dann wird es doch auch sehr langgezogen, wenn der Schusswinkel flach ist. ( So wie Abbiegepfeile, die auf die Fahrbahn gemalt sind). Probiers doch erstmal so wie in dem Code-Beispiel und modifiziere es dann um zu sehen was passiert.

x-pressive

BeitragFr, Feb 20, 2004 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab's gerade kurz getestet -bei einem Terrain jedenfalls scheint das wirklich recht gut zu funktionieren Wink Ich probiere noch mal ein bisschen herum, vielleicht muß man's ja wirklich nicht komplizierter machen.

Perfekt wäre es halt schon, wenn man beliebige Umgebungen damit bedecken könnte -also auch senkrechte Wände, z.B. mit Einbuchtungen usw. -in diesen Situationen wird das von-oben-picken nicht so recht funktionieren.

Für ein Terrain scheint das aber ausreichend zu sein. Auch, wenn das Mesh nicht immer haargenau an der Einschussstelle erscheint.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

wunderkind

BeitragDo, Aug 19, 2004 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Zwei Fragen:

1. Wie gehst du mit Einschüssen größerer Art um, wenn sie unmittelbar an der Kante zweier (oder mehrerer) im großen Winkel zueinander stehenden Polygone auftreffen, z.B. in der Ecke eines Raumes?

2. Das Mesh schmiegt sich an das Terrain an? Ist das praktikabel, wenn es lediglich aus 4 Vertices besteht? Ich meine, kann es nicht sein, dass das Terrain "durchstößt" und "über" dem Einschuss-Mesh zu sehen ist?

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group