Objekt an Untergrund ausrichten
Übersicht

![]() |
DottakopfBetreff: Objekt an Untergrund ausrichten |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dafür ist in Blitz3D netterweise alles da:
BlitzBasic: [AUSKLAPPEN] EntityCollided() Das dürften ein paar der Befehle sein die du suchst, vielleicht noch: BlitzBasic: [AUSKLAPPEN] AlignToVector() |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() nix mehr für heute aber mal gucken was sich da für seltsame konstruckte am anfang ergeben ![]() Danke Danke ! |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Benutzt den Kollisionsvektor CollisionNX![]() |
||
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 THERE 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() - 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! |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was für Rotationswerte? Ich habe kurz das Beispiel aus der Hilfe modifiziert:
BlitzBasic: [AUSKLAPPEN] Graphics3D 640, 480, 0, 2 |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DottakopfBetreff: hmm |
![]() Antworten mit Zitat ![]() |
---|---|---|
der Pick - Cube war in dem oberen beispiel nicht drin. Also du konntest ihn nicht finden ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Drehe das Entity nur dann wenn CollisionNY() klein/groß genug ist. | ||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
jo bissi mit den werten rumgespielt und passt thx ![]() |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group