Einfallswinkel = Ausfallswinkel

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Black Spider

Betreff: Einfallswinkel = Ausfallswinkel

BeitragDo, Dez 07, 2006 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Blitzcoder

Newsposter

BeitragDo, Dez 07, 2006 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 07, 2006 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hilft dir der vierte Beitrag des folgendem:
https://www.blitzforum.de/foru...ht=flipper
 

Krümel

BeitragFr, Dez 08, 2006 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 08, 2006 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 08, 2006 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 08, 2006 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 08, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group