Objekt an Untergrund ausrichten

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Dottakopf

Betreff: Objekt an Untergrund ausrichten

BeitragSa, Okt 19, 2013 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag Blitzer,

ich habe hier ein ganz simples problem.
Ich habe ein 3D Objekt mitt kollisionen.

Nun bewege ich das Objekt eine Rampe hinauf. wie schaffe ich es die das das objet sich dem winkel der rampe anpasst?

Im kopf hätte ich das ich mit entitypick das darunterligende surface/Triange ermitteln muss und den Windel diesen auslesen muss und dann den Winkel meines zu bewegenden Objekts anpasse.
Das würde ich mir aber ziemlich zuckelig vorstellen. Gibts dafür n simplen ansatz, wie würdet Ihr das angehen?


habe hier zum Probieren ein kleines Beispiel mit 2 Rampen aus Primitives gebastelt.


Code: [AUSKLAPPEN]

;
Graphics3D 800,600,16,2
SetBuffer BackBuffer()



;global
Global boden,ramp_small,ramp_big
Global game_cam
Global player



;light
l = CreateLight(2)
LightRange l,10000
MoveEntity l,0,10,0


;boden
boden = CreateCube()
ScaleEntity boden,60,1,60
EntityColor boden,0,255,0
EntityType boden,1

;rampe klein
ramp_small = CreateCylinder(3)
ScaleEntity ramp_small,5,8,10
EntityColor ramp_small,255,0,0
MoveEntity ramp_small,0,1,-10
RotateEntity ramp_small,1,0,90
EntityType ramp_small,1


;rampe groß
ramp_big = CreateCylinder(3)
ScaleEntity ramp_big,10,8,10
EntityColor ramp_big,0,0,255
MoveEntity ramp_big,-20,1,-10
RotateEntity ramp_big,1,0,90
EntityType ramp_big,1



;player
player = CreateCube()
ScaleEntity player,2,3,4
MoveEntity player,0,20,0
EntityColor player,255,255,255
EntityType player,2
EntityRadius player,3


;kamera
game_cam = CreateCamera()
MoveEntity game_cam,0,20,20
PointEntity game_cam,boden




;Collisionen definieren
Collisions 2, 1, 2, 3



;----------------------------------- Main ----------
Repeat
Cls


;billig gravitation
TranslateEntity player,0,-0.3,0

;camera auf Player richten
PointEntity game_cam,player,0



;player movement
If KeyDown(203) Then TurnEntity player,0,1,0
If KeyDown(205) Then TurnEntity player,0,-1,0
If KeyDown(200) Then MoveEntity player,0,0,-0.3
If KeyDown(208) Then MoveEntity player,0,0,0.3


;Player an Untergrund ausrichten ???
;?
;?


UpdateWorld()
RenderWorld()
Flip
If KeyDown(1) Then End
Forever   



Ideen ?


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Kruemelator

BeitragSa, Okt 19, 2013 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür ist in Blitz3D netterweise alles da:
BlitzBasic: [AUSKLAPPEN]
EntityCollided()
CollisionEntity()
CollisionNX()
CollisionNY()
CollisionNZ()

Das dürften ein paar der Befehle sein die du suchst, vielleicht noch:
BlitzBasic: [AUSKLAPPEN]
AlignToVector()

Dottakopf

BeitragSa, Okt 19, 2013 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
ja an das habe ich schon gedacht.. das blöde ist nur, das das dan ziemlich ruckartig wird..
hmm.. bisschen rumprobieren.
Rechtschreibfehler gelten der allgemeinen Belustigung!

DAK

BeitragSo, Okt 20, 2013 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du tun könntest, ist zwar etwas aufwändiger, könnte aber besser aussehen:
Du wirfst einen Linepick von jedem Eck des Objekts aus nach unten, schaust, wo der auftrifft, und orientierst dein Objekt danach. Der Winkel davon lässt sich recht einfach mit Vektorrechnung bestimmen. Der Vorteil davon ist, dass du somit auch eine Rampe, bei der sich die Steigung ändert, gut schaffst.

Als Beispiel folgende Rampe (von der Seite):

Code: [AUSKLAPPEN]
_/TT

Bei der Methode, wo du nur den Winkel des Untergrundes bestimmst, bist du vor der Rampe (_) komplett gerade, dann sobald du auf die Rampe rauf fährst, sofort und übergangslos schief, und nach der Rampe (T) plötzlich wieder gerade.

Die Methode mit den Linepicks an jedem Eck ändert den Winkel graduell.

Eine andere Methode wäre es, den Winkel zwar direkt über den Untergrund zu errechnen, aber die eigene Neigung graduell zu machen:

BlitzBasic: [AUSKLAPPEN]
RotateEntity(EntityPitch(obj)*.95+neuerwinkel*.05,EntityYaw(obj),EntityRoll(obj))


Das ginge zwar sehr einfach und der Winkelwechsel wäre runder, nur das Problem ist, dass hier die Winkeländerung über die Zeit funktioniert, nicht über die Position. Fährt man also an den Rand der Rampe und bleibt dort stehen, dann dreht sich das Objekt auch auf den vollen Winkel der Rampe, was dann eventuell blöd ausschaut.

Bei einer konstanten Geschwindigkeit (oder wenn du die Fahrtgeschwindigkeit bei der Drehgeschwindigkeit mit einbeziehst), geht das ganz gut, wenn das ganze dynamisch sein sollte, dann wäre die erste Option wohl besser.
Gewinner der 6. und der 68. BlitzCodeCompo

Dottakopf

BeitragSo, Okt 20, 2013 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
richtig !

an sowas habe ich auch schon gedacht..und habe mir auch die szenarien im kopf ausgedacht und der gedanke hat mich auch nicht so recht glücklich gemacht. Evt wird es besser wenn man in die berechnung die geschwindigkeit mit einbaut, so könnte man die zeit zum transformieren an den neuen winkel etwas passender errechnen. Wird aber defenetiv eine spielerrei Crying or Very sad

nix mehr für heute aber mal gucken was sich da für seltsame konstruckte am anfang ergeben Smile

Danke Danke !
Rechtschreibfehler gelten der allgemeinen Belustigung!

Dottakopf

BeitragSo, Okt 20, 2013 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm irgendwie denk ich wohl zu einfach.

ich ermittle das Surface unter meinem Objekt:

Code: [AUSKLAPPEN]

CollisionSurface(player, 1)


wie zum geier kann ich nun den winkel dieses surfaces ermitteln ?

alle Entity befehle schlagen fehl da er das objekt nicht findet ?
Muss ich ein surface extra behandelt ?

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Xeres

Moderator

BeitragSo, Okt 20, 2013 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutzt den Kollisionsvektor CollisionNX/Y/Z wie Kruemelator schon schrieb. Das ist doch alles was du brauchst?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am So, Okt 20, 2013 16:51, insgesamt einmal bearbeitet

Dottakopf

BeitragSo, Okt 20, 2013 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
hm ja und nein. Ich weis nicht ob ich damit glücklich werde, da es mir ja nur die Rotationswerte des Entitys zurückgibt. ungeachtet der vielfalt an formen die es haben kann.

ich will wirklich ermitteln welchen winkel das surface unter mir hat.

also das müsste dann irgendwie so in die richtung gehen. Bei mir kommt aber nur verwirrende bewegungen raus Confused

- habe in der Figur einen kleinen picker/cube hinzugefügt, diesen nach unten gedreht und als child an den spieler gehängt.
- ich picke das Triangle unter mir und setze den player(parent) auf den neuen winkel.
- nur irgendwie wird das voll seltsam falsch verdreht
Code: [AUSKLAPPEN]


   obj = EntityPick(player_picker,50000)
   
   TFormNormal PickedTriangle(),PickedTriangle(),PickedTriangle(),PickedEntity(),0
   AlignToVector player,TFormedX(),TFormedY(),TFormedZ(),2,0.1
   




Hmm das kann doch nicht so schwer sein ^^
Rechtschreibfehler gelten der allgemeinen Belustigung!

Xeres

Moderator

BeitragSo, Okt 20, 2013 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Was für Rotationswerte? Ich habe kurz das Beispiel aus der Hilfe modifiziert:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()
camera = CreateCamera()
RotateEntity camera, 45, 0, 0
PositionEntity camera, 0, 15, - 10
light = CreateLight()
RotateEntity light, 45, 0, 0

sphere = CreateCone()
EntityType sphere, 1
EntityRadius sphere, 1
PositionEntity sphere, 0, 11, 0

cube = CreateCube()
EntityType cube, 2
EntityColor cube, 0, 100, 0
PositionEntity cube, 0, - 5, 0
ScaleEntity cube, 10, 10, 10

cylinder = CreateCone()
EntityType cylinder, 2
EntityColor cylinder, 255, 0, 0
PositionEntity cylinder, 0, 6, 0
ScaleEntity cylinder, 2, 1, 2

Collisions 1, 2, 2, 2

While Not KeyDown(1)
x# = 0
y# = 0
z# = 0
If KeyDown(203) = 1 Then x# = - 0.1
If KeyDown(205) = 1 Then x# = 0.1
If KeyDown(208) = 1 Then z# = - 0.1
If KeyDown(200) = 1 Then z# = 0.1
MoveEntity sphere, x#, - 0.1, z#
UpdateWorld
RenderWorld
col = CountCollisions(sphere)

Text 0, 0, "Kollision(en):"
For i = 1 To col
Text 000, i * 20, "Entity=" + CollisionEntity(sphere, i)
Text 150, i * 20, "NX=" + CollisionNX(sphere, i)
Text 300, i * 20, "NY=" + CollisionNY(sphere, i)
Text 450, i * 20, "NZ=" + CollisionNZ(sphere, i)
AlignToVector sphere,CollisionNX(sphere,i),CollisionNY(sphere,i),CollisionNZ(sphere,i),2,1
Next
Flip
Wend
End
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Dottakopf

Betreff: hmm

BeitragSo, Okt 20, 2013 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
der Pick - Cube war in dem oberen beispiel nicht drin. Also du konntest ihn nicht finden Smile

Ganz ehrlich, ich bin jetzt ein wenig verwirrt. Hab ja heute schon ne ganze zeitlang mit verschiedenen ansätzen probiert und meine das ich das so versucht hatte. Ärgert mich jetzt auch weil es wirklich so simpel war.

Großen dank für deine Hilfe, hatte ja schon alles da..

~Edit~

Halt stop jetzt ist mir wieder eingefallen was das problem war.
fahre ich von der seite/hinten gegen die Rampe passt er sich auch dem winkel des Objektes an. Daher wollte ich nur das ermitteln was sich wirklich unter ihm befindet.

Problem siehe Hier:
Code: [AUSKLAPPEN]

;
Graphics3D 800,600,16,2
SetBuffer BackBuffer()



;global
Global boden,ramp_small,ramp_big
Global game_cam
Global player,player_picker
Global count_coll


;light
l = CreateLight(2)
LightRange l,10000
MoveEntity l,0,10,0


;boden
boden = CreateCube()
ScaleEntity boden,60,1,60
EntityColor boden,0,255,0
EntityType boden,1



;rampe klein
ramp_small = CreateCylinder(3)
ScaleEntity ramp_small,5,8,10
EntityColor ramp_small,255,0,0
MoveEntity ramp_small,0,1,-10
RotateEntity ramp_small,1,0,90
EntityType ramp_small,1




;rampe groß
ramp_big = CreateCylinder(3)
ScaleEntity ramp_big,10,8,10
EntityColor ramp_big,0,0,255
MoveEntity ramp_big,-20,1,-10
RotateEntity ramp_big,1,0,90
EntityType ramp_big,1




;player
player = CreateCube()
ScaleEntity player,2,3,4
MoveEntity player,0,20,0
EntityColor player,255,255,255
EntityType player,2
EntityRadius player,3
EntityAlpha player,0.7







;kamera
game_cam = CreateCamera()
MoveEntity game_cam,0,20,20
PointEntity game_cam,boden



;Collisionen definieren
Collisions 2, 1, 2, 3



;----------------------------------- Main ----------
Repeat
Cls


;billig gravitation
TranslateEntity player,0,-0.3,0

;camera auf Player richten
PointEntity game_cam,player,0



;player movement
If KeyDown(203) Then TurnEntity player,0,1,0
If KeyDown(205) Then TurnEntity player,0,-1,0
If KeyDown(200) Then MoveEntity player,0,0,-0.3
If KeyDown(208) Then MoveEntity player,0,0,0.3





UpdateWorld()
RenderWorld()

;Player an Untergrund ausrichten ???

col = CountCollisions(player)
For i = 1 To col
   AlignToVector player,CollisionNX(player,i),CollisionNY(player,i),CollisionNZ(player,i),2,1
Next

   
   



Flip
If KeyDown(1) Then End
Forever   


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Kruemelator

BeitragSo, Okt 20, 2013 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Drehe das Entity nur dann wenn CollisionNY() klein/groß genug ist.

Dottakopf

BeitragSo, Okt 20, 2013 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
jo bissi mit den werten rumgespielt und passt thx Very Happy
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group