Zittern 3dObjekte

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

primero

Betreff: Zittern 3dObjekte

BeitragSo, Dez 20, 2009 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Folgendes Problem habe ich derzeit:
wenn ich die Kamera an ein Objekt binde (child funktion) und dieses Objekt dann bewege beginnt es zu ruckeln. sobald die Kamera aber gelöst ist ist das Ruckel fort.

es geht im Grund um den Code
Code: [AUSKLAPPEN]
Global timer
Global kugel
Global kamera

Graphics3D 1024,600,32,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

timer=CreateTimer(30)
kugel=CreateSphere(64)
ScaleMesh kugel,100000,100000,100000

kamera=CreateCamera(kugel)
MoveEntity kamera,100010,0,0
CameraRange kamera,1,1000

WireFrame 1

While Not KeyHit(1)
   WaitTimer(timer)
   TurnEntity kugel,0.0001,0,0
   
   MoveMouse 300,300
   TurnEntity kamera,0,-MouseXSpeed(),0
   TurnEntity kamera,MouseYSpeed(),0,0
   If KeyDown(31) Then MoveEntity kamera,0,0,-10
   If KeyDown(17) Then MoveEntity kamera,0,0,10
   UpdateWorld
   RenderWorld
   Flip
Wend
End


woran liegtdies und wie kann man es abschalten\umgehen?

Nicdel

BeitragSo, Dez 20, 2009 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke mal, das liegt an deinen riesigen Dimensionen, also die Größe der Kugel, bzw. die Position der Kamera.
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
 

primero

BeitragSo, Dez 20, 2009 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke

hab es ja befürchtet.

Nun ja, muss ich mir was überlegen wie es zu umgehen ist.

Tankbuster

BeitragSo, Dez 20, 2009 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, das liegt an den großen Dimensionen. Da dann eine ungenauigkeit bei den Floats entsteht.
Ist ja auch klar, es geht nicht eine Float Zahl wie 100000.4234532 darzustellen.
Je größer ein Float wird, desto mehr Nachkommastellen gehen eben verloren.
0.00006 lässt sich noch gut darstellen, während 10000.00006 einfach nichtmehr geht. In 4 Bytes kann man eben nicht alles reinpacken.
Da ist es ganz klar, dass die Kamera nicht korrekt positioniert wird.

Code: [AUSKLAPPEN]
Nun ja, muss ich mir was überlegen wie es zu umgehen ist.


Eventuell solltest du einfach alles kleiner Skalieren?
Twitter
Download Jewel Snake!
Windows|Android
 

primero

BeitragSo, Dez 20, 2009 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, die Floatwerte usw. sind schon klar. darum habe ich im eig. Programm einen Punkt erstellt und an den die Kamera gebunden.

nun sollte man annehmen dass eine xentfernung zu dem Punkt relativ egal ist wenn man diesen eben nur um die x Achse dreht, sprich im endefeckt die Kamera um sich selbst.

wenn die Kamera an den Punkt gebunden ist (der zugleich der Mittelpunkt der Kugel darstelt) zittert die Kugel bei der drehung. ist die Kamera getrennt -sprich dreht sich nicht mit, bewegt sich die Kugel problemlos.

Code: [AUSKLAPPEN]

...
punkt=createpivot()
kugel=CreateSphere(64,punkt)
ScaleMesh kugel,100000,100000,100000

kamera=CreateCamera(punkt)
...

   TurnEntity punkt,0.0001,0,0
...


womit die Kamera unabhängig von der Kugel gedreht wird (tehoretisch, praktisch werden beide durch den selben Punkt gedreht)

Da es jeweils die x-Achse ist sollte die Entfernung keine Rolle Spielen.

Ich vermute jedoch dass aufgrund der Größe der Kugel die Kamera zu nahe am Objekt ist. ansonsten kann ich mir das Ruckeln nicht erklähren.


EDIT: letztlich beibt effect und wohl Uhrsache gleich, darum habe ich im Beispielprogramm im ersten Beitrag den Punkt nicht erstellt

Die Größe ist zwingend vorgegeben, andernfalls muss ich andere Objekte eben kleiner skalieren was den Effect aufhebt.

Tankbuster

BeitragSo, Dez 20, 2009 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
...
punkt=createpivot()
kugel=CreateSphere(64,punkt)
ScaleMesh kugel,100000,100000,100000

kamera=CreateCamera(punkt)
MoveEntity kamera,100010,0,0
...

   TurnEntity punkt,0.0001,0,0
...


Die Kamera dreht sich nicht um sich selbst, sondern um den punkt. Die Entfernung kannst du nicht so einfach wegnehmen. Die Kamera rotiert nicht nur, sondern wird durch die Rotation des Mittelpunktes auch jede Schleife anders Positioniert.

Schau dir das mal an:
Code: [AUSKLAPPEN]
 Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()
camera = CreateCamera()
light = CreateLight(1)
RotateEntity light, 90, 0, 0

planet = CreateSphere(8)
EntityColor planet, 200, 200, 250
PositionEntity planet, 0, 0, 5
RotateEntity planet, 10, 10, 10

moon1 = CreateSphere(8)
EntityParent moon1, planet, 0
ScaleEntity moon1, .2, .2, .2
MoveEntity moon1, 0, 0, 2

moon2 = CreateSphere(8)
EntityParent moon2, planet, 0
ScaleEntity moon2, .4, .4, .4
MoveEntity moon2, 0, 0, - 3

While Not KeyDown(1)
   TurnEntity planet, 0, 1, 0
   RenderWorld
   Flip
Wend
End


Deine Kamera macht im Prinzip das gleiche wie diese Monde.
Twitter
Download Jewel Snake!
Windows|Android
 

primero

BeitragSo, Dez 20, 2009 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht ganz.

Habe mal den Punkt direkt an die Kameraposition gesetzt und dann die kamera mit der selben umdrehungsgeschwindigkeit wie die Kugel gedreht

Code: [AUSKLAPPEN]

punkt=createpivot()
kamera=createkamera(punkt)
moveentity punkt, "oberkantekugel"
...
turnentity kugel,0.01,0,0
turnentity punkt,0.01,0,0
...


Gleichbleibende Kugelgröße usw.
Effekt: Gitter der Kugel zittert wenn die kamera ein child des Punktes ist, zittert nicht und dreht sich geschmeidig wenn die kamera kein child ist.

Die Kamera dreht sich im Grund so wie die Monde wenn du sie so drehen lässt:
Code: [AUSKLAPPEN]

...
   TurnEntity planet, 0, 0, 1
...


Das Problem besteht so weit ich es bisher raus habe mehr in der relativen nähe zur Kugel im Verhältniss zu ihrer Größe.
meint:
G=größe
E=Entfernung Kugel-Kamera
E\G= 1.0001 -> zittern
E\G=1.5 -> kein Zittern bzw. nicht mehr sichtbar

d.h. da ich die Kamera bei einer kleinerne Kugel näher ranlegen müsste ist die Idee in der momentanen Form wohl gestorben. Zumindest bis ich einen Ausweg gefunden hab^^.

Aber danke für die raschen Antworten.

Tankbuster

BeitragSo, Dez 20, 2009 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Was willst du eigentlich genau machen? Es gibt eigentlich immer irgendwelche Alternativen.
Twitter
Download Jewel Snake!
Windows|Android
 

primero

BeitragSo, Dez 20, 2009 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Grundgedanke ist ein Planetenmodell. daher auch die zwingende Größenvorgabe der Kugel - Planet im Verhältniss zu den jeweiligen objekten darauf.

dreht sich die Kamera nicht mit würde der Planet sich unter ihr einfach "durchdrehen" was den Effect des "sich darauf befinden" zerstört.

NightPhoenix

BeitragSo, Dez 20, 2009 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt soweit ich weiß keine Möglichkeit mit normalen Grafikengines ein reales Größenverhältnis bei einem Planetensystem, geschweige denn einem einzelnen Planeten, darzustellen. Dafür rechnen Computer in realtime 3D viel zu ungenau

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group