Einfallswinkel = Ausfallswinkel
Übersicht

![]() |
Black SpiderBetreff: Einfallswinkel = Ausfallswinkel |
![]() Antworten mit Zitat ![]() |
---|---|---|
So,
wollte ne kleine Routine für Granaten schreiben, und sie ins Codearchiv packen, doch nun brauche ich erstmal eure Hilfe. Geht um folgendes: Einfallswinkel = Ausfallswinkel, d.h. das die Granate an Wänden usw. abprallt. Leider kommt es bei meinem Code zu unschönen rucklern, und die Kugel verhakt sich. nicht schön, allerdings finde ich den Fehler nicht... Danke schonmal und hier der Update-Code: Code: [AUSKLAPPEN] For g.gran = Each gran
;wenn sie Kollidiert For k=1 To CountCollisions(g\piv) If GetEntityType(CollisionEntity(g\piv,k)) = k_w Then g\cx# = CollisionX(g\piv,k) g\cy# = CollisionY(g\piv,k) g\cz# = CollisionZ(g\piv,k) g\cnx# = CollisionNX(g\piv,k) g\cny# = CollisionNY(g\piv,k) g\cnz# = CollisionNZ(g\piv,k) g\pitch# = ATan2(g\cx,g\cnx);Winkel wird errechnet g\yaw# = ATan2(g\cy,g\cny) End If Next ;hier hätte ich auch MoveEntity nehmen können, aber wollte das einfach so machen g\mx#=Sin(g\yaw#)*g\speed#*Cos(g\pitch#) g\my#=Sin(g\pitch#)*g\speed# g\mz#=Cos(g\yaw#)*g\speed#*Cos(g\pitch#) g\x# = g\x#+g\mx# g\y# = g\y#+g\my# g\z# = g\z#+g\mz# PositionEntity g\piv,g\x#,g\y#,g\z# ;--- g\speed# = g\speed# -.005 ;und futsch... If g\speed# <= 0 Then FreeEntity g\piv:Delete g Next und zum testen der ganze Code. (der Fehler muss irgendwo oben liegen, aber wer´s selbst sehen will, für den ist dieser Code interessant:) Code: [AUSKLAPPEN] ;Granaten-routine
Init_Graphics() Const k_W = 1 Const k_G = 2 Collisions k_g,k_w,2,2 Global Camera = CreateCamera() MoveEntity camera,0,5,-5 CameraRange camera,.1,1500 CameraClsColor camera,255,255,255 cub1 = CreateCube() PositionEntity cub1,-3,3,9 ScaleEntity cub1,1,7,5 RotateEntity cub1,0,135,0;-45 EntityType cub1,k_w EntityColor cub1,90,90,90 cub2 = CreatePlane() PositionEntity cub2,0,-3,0 EntityType cub2,k_w EntityColor cub2,80,80,80 EntityFX cub2,1 CreateLight(3) Type gran Field obj Field piv Field x#, y#, z# Field mx#, my#, mz# Field speed# Field pitch# Field yaw# Field cx# Field cy# Field cz# Field cnx# Field cny# Field cnz# End Type While Not(KeyHit(1)) If KeyDown(205) Then TurnEntity camera,0,-1,0 If KeyDown(203) Then TurnEntity camera,0,1,0 If KeyDown(208) Then MoveEntity camera,0,0,-.3 If KeyDown(200) Then MoveEntity camera,0,0,.3 If KeyHit(57) Then g.gran = New gran g\piv = CreatePivot() g\obj = CreateSphere(9,g\piv) EntityAlpha g\obj,.9 EntityColor g\obj,50,50,50 EntityFX g\obj,1 EntityType g\piv,k_g EntityRadius g\piv,2,2 g\x# = EntityX(camera) g\y# = EntityY(camera) g\z# = EntityZ(camera) g\pitch# = EntityPitch(camera) g\yaw# = -EntityYaw(camera) g\speed# = 1 End If If KeyHit(15) Then g.gran = New gran g\piv = CreatePivot() g\obj = CreateSphere(9,g\piv) EntityAlpha g\obj,.9 EntityColor g\obj,50,50,50 EntityFX g\obj,1 EntityType g\piv,k_g EntityRadius g\piv,2,2 g\x# = EntityX(camera) g\y# = EntityY(camera) g\z# = EntityZ(camera) g\pitch# = EntityPitch(camera)-20 g\yaw# = -EntityYaw(camera) g\speed# = 1 End If For g.gran = Each gran For k=1 To CountCollisions(g\piv) If GetEntityType(CollisionEntity(g\piv,k)) = k_w Then g\cx# = CollisionX(g\piv,k) g\cy# = CollisionY(g\piv,k) g\cz# = CollisionZ(g\piv,k) g\cnx# = CollisionNX(g\piv,k) g\cny# = CollisionNY(g\piv,k) g\cnz# = CollisionNZ(g\piv,k) g\pitch# = ATan2(g\cx,g\cnx) g\yaw# = ATan2(g\cy,g\cny) End If Next g\mx#=Sin(g\yaw#)*g\speed#*Cos(g\pitch#) g\my#=Sin(g\pitch#)*g\speed# g\mz#=Cos(g\yaw#)*g\speed#*Cos(g\pitch#) g\x# = g\x#+g\mx# g\y# = g\y#+g\my# g\z# = g\z#+g\mz# PositionEntity g\piv,g\x#,g\y#,g\z# g\speed# = g\speed# -.005 If g\speed# <= 0 Then FreeEntity g\piv:Delete g Next UpdateWorld RenderWorld Flip Wend End Function Init_Graphics() Graphics3D 1024,768,32,1 SetBuffer BackBuffer() HidePointer() MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 End Function |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mir deinen Code jetzt nicht angeschaut, aber of verhakt sie die Granate in der Wand, weil sie nach dem Umdrehen ja immer noch kollidiert, und somit immer wieder wechselt. Also setzte sie nach dem Winkel ändern ein Stück von der Wand weg. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht hilft dir der vierte Beitrag des folgendem:
https://www.blitzforum.de/foru...ht=flipper |
||
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
hab mir dein programm mal angeschaut und der übersichtlichkeit wegen alles was mir überflüssig erschien gelöscht. Ausfallswinkel wird über dot product (skalarprodukt) berechnet. Viele Grüße, Krümel Code: [AUSKLAPPEN] ;Granaten-routine Init_Graphics() Const k_W = 1 Const k_G = 2 Collisions k_g,k_w,2,1 Global Camera = CreateCamera() MoveEntity camera,0,5,-5 CameraRange camera,.1,1500 CameraClsColor camera,255,255,255 cub1 = CreateCube() PositionEntity cub1,-3,3,9 ScaleEntity cub1,1,7,5 RotateEntity cub1,0,135,0;-45 EntityType cub1,k_w EntityColor cub1,90,90,90 cub2 = CreatePlane() PositionEntity cub2,0,-3,0 EntityType cub2,k_w EntityColor cub2,80,80,80 EntityFX cub2,1 CreateLight(3) Type gran Field obj Field x#, y#, z# Field mx#, my#, mz# End Type While Not(KeyHit(1)) If KeyDown(205) Then TurnEntity camera,0,-1,0 If KeyDown(203) Then TurnEntity camera,0,1,0 If KeyDown(208) Then MoveEntity camera,0,0,-.3 If KeyDown(200) Then MoveEntity camera,0,0,.3 If KeyHit(57) Then g.gran = New gran g\obj = CreateSphere(9,camera) : EntityParent g\obj,0 EntityAlpha g\obj,.9 EntityColor g\obj,50,50,50 EntityFX g\obj,1 EntityType g\obj,k_g EntityRadius g\obj,2,2 g\mx#=Sin( -EntityYaw (camera) ) * 1.5 g\my#=Sin( -EntityPitch(camera) ) * 1.5 g\mz#=Cos( -EntityYaw (camera) ) * 1.5 End If For g.gran = Each gran For k=1 To CountCollisions(g\obj) If GetEntityType(CollisionEntity(g\obj,k)) = k_w Then d#=-2.0*(g\mx*CollisionNX(g\obj,k) + g\my*CollisionNY(g\obj,k) + g\mz*CollisionNZ(g\obj,k)) g\mx=(g\mx + d * CollisionNX(g\obj,k)) * 0.6 g\my=(g\my + d * CollisionNY(g\obj,k)) * 0.6 g\mz=(g\mz + d * CollisionNZ(g\obj,k)) * 0.6 End If Next TranslateEntity g\obj,g\mx#,g\my#,g\mz# , 1 g\mx = g\mx * 0.98 g\my = (g\my - 0.02) * 0.98 g\mz = g\mz * 0.98 speed# = (g\mx*g\mx + g\my*g\my + g\mz*g\mz) If speed < 0.001 Then FreeEntity g\obj:Delete g Next UpdateWorld RenderWorld Flip Wend End Function Init_Graphics() Graphics3D 1024,768,32,2 SetBuffer BackBuffer() HidePointer() MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 End Function |
||
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey, danke! Das ist geil,
kannste kurz erklären wie das genau Funktioniert? Skalarprodukt kenn´ ich, aber genau erkennen kann ich es gerade nicht... Skalarprodukt war doch Vektor1*Vektor2 = Betrag_Vektor1 * Betrag_Vektor2 * cos(winkel); Und ließe sich mit Code: [AUSKLAPPEN] Function Skalar(x1, y1, z1, x2, y2, z2)
Return ((x1*x2) + (y1*y2) + (z1*z2)) End Function ausrechnen (so hab ich´s immer gemacht)... wieso mx = (mx+d*CollisionNX)*.6 das verstehe ich net; Danke! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hi!
hier wird das dot product berechnet: d#=-2.0*(g\mx*CollisionNX(g\obj,k) + g\my*CollisionNY(g\obj,k) + g\mz*CollisionNZ(g\obj,k)) um die bewegungsrichtung tatsächlich zu verändern muss das dotproduct (d) mit der kollisionsnormalen multipliziert werden. das ergebnis addierst du zur bisherigen bewegung dazu. g\mx=(g\mx + d * CollisionNX(g\obj,k)) * 0.6 g\my=(g\my + d * CollisionNY(g\obj,k)) * 0.6 g\mz=(g\mz + d * CollisionNZ(g\obj,k)) * 0.6 das ( * 0.6 ) am ende dient nur dazu die bewegung abzubremsen. du kannst mal ausprobieren das wegzulassen, dann hüpft der ball etwas gummiartiger. |
||
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich bin zwar ein Noob was die Codes betrifft, aber ist das nciht so, dass der Einfallswinkel immer glecih dem Austritts winkel ist?
Also 180° Dann müsste man, wenn z.b. die Kugel nach rechts mit dem Wert 2 wandert und an die Wand knallt, einfach *-1 und dann ist das so... oder?^^ |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
@krümel:
das mit dem *0.6 hatte ich schon kapiert, und werd´s auch für verschiedene Granatentypen benutzen; interessant wird´s bei einem Negativen Wert, da bleibt sie dann kleben. (Wird also im neuen Spiel ne Klebe-/Flummi- und natürlich normale Granate geben ^^) Das mit dem Skalarprodukt hab ich jetzt auch verstanden, danke! ^^ @Chrise: net ganz, einfallswinkel = ausfallswinkel, das stimmt schon (so heisst auch der Thread ^^), aber du musst ja gucken wie die Kugel aufprallt. es reicht nicht jeden wert mit -1 mal zu nehmen, denn wenn sie Frontal auf ein Objekt prallt, dann wird sie ja z.B. nur nach z zurückgestoßen.. Danke nochmal an alle! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group