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

![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist zwar eine gute Idee ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab's gerade kurz getestet -bei einem Terrain jedenfalls scheint das wirklich recht gut zu funktionieren ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group