mesh in richtung maus drehen
Übersicht

alliswrongBetreff: mesh in richtung maus drehen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mein gott, mit dem ganzen 3d zeugs muss man erstmal klar kommen.
ich habe nun folgendes problem: ich habe vor ein spiel in b3d spaßeshalber zu schreiben. hierbei sieht man ein raumschiff "von oben". das heißt, die Z achse spielt keine rolle (bis auf die zoomstufe). nun kann ich mein raumschiff mit den pfeiltasten bewegen - soweit sogut. Nun möchte ich aber einen schritt weiter: Mein Raumschiff soll sich immer richtung maus drehen (ROLL). Habe hierzu auch schon paar stunden im forum verbracht um eine lösung zu finden. Allerdings finde ich immer nur ausrichtungen die meinen ansprüchen nicht gerecht werden bzw. die ich scheinbar nicht nachvollziehen kann. Ich bin so ein mensch, ich möchte verstehen wie das funktioniert. Hierzu nehme ich mir immer code und nehme den auseinander bis ich weiß was er genau macht. Doch diesmal finde ich keinen code dazu und auch keine hilfestellung. Wer weiß rat? Achso, hier mal nen beispielcode um zu sehen wie die camera ausgerichtet ist. Code: [AUSKLAPPEN] Graphics3D 800,600,32,2 SetBuffer BackBuffer() player = CreateCube() camera = CreateCamera() light = CreateLight() PositionEntity camera, 0,0,-20 While Not KeyHit(1) UpdateWorld RenderWorld Text 0,0,"X: " + x_unter Flip Wend End vielen dank euch allen. |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm probiers mal hiermit. Der Player wird mit dem Befehl Aligntovector auf die Koordinaten des Cursors ausgerichtet (dabei muss man die Mousekoordinaten anhand der Auflösung umrechnen).
Code: [AUSKLAPPEN] Graphics3D 800,600,32,2
SetBuffer BackBuffer() player = CreateCone() camera = CreateCamera() light = CreateLight() PositionEntity camera,0,0,-20 While Not KeyHit(1) mx=-(GraphicsWidth()/2-MouseX()) my=GraphicsHeight()/2-MouseY() AlignToVector player,mx,my,0,2,0.05 UpdateWorld RenderWorld Text 0,0,mx+","+my Flip Wend End |
||
alliswrong |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hallo, danke für die antwort.
diese lösung habe ich auch schon erarbeitet gehabt, allerdings funktioniert das ganze nicht. denn mein code funktioniert etwas anders. undzwar so: ich erstelle einen player und eine camera. die camera ist parent vom player. nun kann ich den player per pfeiltasten bewegen. dies geschieht mithilfe von moveentity. wenn ich nun dannach noch die funktion aligntovector benutze, so entsteht eine crazy steuerung. wenn ich nach "oben" steuere und die maus drehe so ändert sich die flugrichtung nicht dementsprechend, sondern ich fliege dann "rückwärts". dieses problem kriege ich nicht gelöst. [edit] habe mal eben nen lauffähiges beispiel gezaubert. schaut es euch mal an. Steuerung per W/A/S/D. mit "1" und "2" kann man rein und rauszoomen. Die mausbedienung ist crazy ![]() Code: [AUSKLAPPEN] Graphics3D 640, 480, 32, 2 SetBuffer BackBuffer() Type player ; Koordinaten Field x# Field y# Field z# ; Bewegung Field speed# ; Beschleunigungsgeschwindigkeit Field stopspeed# ; "Ausrollen" geschwindigkeit Field maxspeed# ; Maximale geschwindigkeit Field move% ; Bewegt sich der player? ; Kamera + Model Field camera_zoom Field camera Field model ;Temporäre Variablen Field tmp_speedX# Field tmp_speedY# Field tmp_lastmoveX$ Field tmp_lastmoveY$ End Type p.player = New player p\x# = 0 p\y# = 0 p\z# = 0 p\speed# = 0.1 p\stopspeed# = p\speed# / 2 p\maxspeed# = 2 p\move% = 0 p\camera_zoom = -90 p\camera = CreateCamera() p\model = CreateCube() EntityParent p\camera, p\model EntityType p\model, 1 ; ### ;light = CreateLight() cu = CreateSphere(32) PositionEntity cu, 30, 0, 0 ScaleMesh cu, 20, 20, 20 EntityRadius cu, 20 EntityType cu, 2 worldl = CreateLight(2) LightColor worldl, 0,0, 255 LightRange worldl, 100 PositionEntity worldl, 30, 0,-200 AmbientLight 100,100,0 While Not KeyHit(1) ; #### MOVEMENT #### player_movement() ; ### ZOOM ### If KeyDown(2) Then p\camera_zoom = p\camera_zoom + 10 If KeyDown(3) Then p\camera_zoom = p\camera_zoom - 10 PositionEntity p\camera, 0, 0, p\camera_zoom Collisions 1, 2, 1, 2 ; ### ZOOM ### ; ### NEU ### mx=-(GraphicsWidth()/2-MouseX()) my=GraphicsHeight()/2-MouseY() AlignToVector p\model,mx,my,0,2,0.05 ; ############ UpdateWorld RenderWorld Flip Wend End ; Spielerbewegung Function player_movement() For players.player = Each player players\move% = 0 If KeyDown(17) Then players\tmp_speedY# = players\tmp_speedY# + players\speed# players\tmp_lastmoveY$ = "up" players\move% = 1 If KeyDown(31) Then players\tmp_speedY# = players\tmp_speedY# - players\speed# players\tmp_lastmoveY$ = "down" players\move% = 1 If KeyDown(30) Then players\tmp_speedX# = players\tmp_speedX# - players\speed# players\tmp_lastmoveX$ = "left" players\move% = 1 If KeyDown(32) Then players\tmp_speedX# = players\tmp_speedX# + players\speed# players\tmp_lastmoveX$ = "right" players\move% = 1 If players\move% = 0 And players\tmp_lastmoveY$ = "up" Then players\tmp_speedY# = players\tmp_speedY# - players\stopspeed# If players\move% = 0 And players\tmp_lastmoveY$ = "up" And players\tmp_speedY# < 0 Then players\tmp_speedY# = 0 players\tmp_lastmoveY$ = "" If players\move% = 0 And players\tmp_lastmoveY$ = "down" Then players\tmp_speedY# = players\tmp_speedY# + players\stopspeed# If players\move% = 0 And players\tmp_lastmoveY$ = "down" And players\tmp_speedY# > 0 Then players\tmp_speedY# = 0 players\tmp_lastmoveY$ = "" If players\move% = 0 And players\tmp_lastmoveX$ = "left" Then players\tmp_speedX# = players\tmp_speedX# + players\stopspeed# If players\move% = 0 And players\tmp_lastmoveX$ = "left" And players\tmp_speedX# > 0 Then players\tmp_speedX# = 0 players\tmp_lastmoveX$ = "" If players\move% = 0 And players\tmp_lastmoveX$ = "right" Then players\tmp_speedX# = players\tmp_speedX# - players\stopspeed# If players\move% = 0 And players\tmp_lastmoveX$ = "right" And players\tmp_speedX# < 0 Then players\tmp_speedX# = 0 players\tmp_lastmoveX$ = "" If players\tmp_speedX# > players\maxspeed# Then players\tmp_speedX# = players\maxspeed# If players\tmp_speedX# < -players\maxspeed# Then players\tmp_speedX# = -players\maxspeed# If players\tmp_speedY# > players\maxspeed# Then players\tmp_speedY# = players\maxspeed# If players\tmp_speedY# < -players\maxspeed# Then players\tmp_speedY# = -players\maxspeed# players\x# = players\tmp_speedX# players\y# = players\tmp_speedY# MoveEntity players\model, players\x#, players\y#, players\z# Next End Function |
||
- Zuletzt bearbeitet von alliswrong am Fr, Jul 10, 2009 19:48, insgesamt einmal bearbeitet
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gut, das stand so nicht da ![]() |
||
alliswrong |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mir fehlt ein bisschen das verständnis eines pivots. ist das nur ein unsichtbares entity?
[edit] schau dir mal mein beispiel oben an. |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, ein Pivot kann man wie ein 3D-Objekt ansprechen, es ist aber unsichtbar. Also nur ein Punkt im 3D-Raum. Ich habe da mal was mit einem Raumschiff gemacht, schau Dir mal die Funktion InitPlayer an:
http://www.blitzbasic.com/code...?code=2393 |
||
alliswrong |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
habe das ganze mal abgeändert. habe nen pivot erzeugt, mein player model als parent dran gehangen und die camera als parent drangehangen. nun folgt mein player dem mauszeiger. allerdings fliegt der player immer noch rückwärts, wenn ich ihn um 180 grad mit der maus drehe und dann nach "vorne" drücke.
lasse ich den ganzen per alignvecotor ausrichten ist die steuerung noch abgefahrener. |
||
alliswrong |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
so leute, es funktioniert leider noch immer nicht. habe schon alles versucht, angefangen von rotateentity bishin zu pivot. kriege es nicht hin. vielleicht kann sich mal jemand dazu äußern? selbst das beispiel von kirschan bringt mich nicht weiter... | ||
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde eine unsichtbare Flache auf höhe des raumschiffes machen (createplane) und dann mit ScreenPick auf dieser fläche eine position im 3d raum ermitteln, und dann das raumschif mit pointentity auf pickedX u.s.w ausrichten. | ||
|moonForge|
Ich bin Pokémon Meisterin seit 1998! |
SiSoFlo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dazu braucht man doch keine plane, man kann doch direkt MouseX und MouseY verwenden, oder? | ||
So wie ihr von anderen Menschen behandelt werden wollt so behandelt sie auch! |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn du lust hast rumzurechnen (von wegen ATan und 2Dxy->3Dxyz) ja =) wenn du die rechnerei im besten fall der graka zuschieben willst mach das plane | ||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ist CameraPick![]() |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group