Objekte in Welt Koordinaten.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Objekte in Welt Koordinaten.

Beitrag von SMaag »

Welt Koordinaten. Wieder so ein Ding was ich noch nicht richtig kapiere. Die Forumssuche hat mir leider auch nicht weiter geholfen.

Mein Grundproblem:

Wie bekomme ich es hin, eine 3D Welt in mm zu erstellen, bwz. meine Objecte, welche in mm vorliegen, in Weltkoordinaten zu bringen?

Das Beispiel aus der PB-Hilfe
CreateLine3D(0, 0, 0, 0, RGB(255, 0, 0), 1, 1, 1, RGB(0, 0, 255))

erzeugt eine Linie in Weltkoordinaten von 0,0,0 zu 1,1,1! Diese wird aber ziemlich lange dargestellt.

Ich stelle mir das so vor:
- Die kleinste Welteinheit ist 1
- Wie groß das angezeigt wird hängt von der Kamera-Entfernung ab.
- Wenn ich ganze mm darstellen möchte mach ich 1 World Unit = 1mm
- Wenn ich 1/10mm darstellen möchte, dann 1 WorldUnit = 0.1mm

- ich gehe davon aus dass WorldUnits 64Bit Intgeger sind, d.h. ich kann die von -9223372036854775808 bis +9223372036854775807 verwenden

Der Rest ist dann eine einfache Umrechung und die Anzeigegröße (Zoom) wird mit Camera-Funktionen gemacht!
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Objekte in Welt Koordinaten.

Beitrag von juergenkulow »

Code: Alles auswählen

; MoveCamera z=263 x=0 y=0  
; CreateLine3D x=0 zu 100.0 y=0 z=0 Linienlänge auf meinen Bildschirmen 100 mm oder 238 mm
; CreateLine3D x=0, y=0 zu 100.0 z=0 Linienlänge auf meinen Bildschirmen 100 mm oder 238 mm
ExamineDesktops()
#Screen=0
ScreenX = DesktopWidth(#Screen)
ScreenY = DesktopHeight(#Screen)
OpenWindow(0,0,0,ScreenX,ScreenY,"",#PB_Window_BorderLess)
AddKeyboardShortcut(0, #PB_Shortcut_Escape, #ESC) 
InitEngine3D()  
InitSprite()
InitKeyboard()
InitMouse()
OpenWindowedScreen(WindowID(0), 0, 0, ScreenX, ScreenY)
CreateCamera(0, 0, 0, 100, 100) ;"Fullscreen"-Camera
CameraBackColor(0, RGB(0, $20 , 0))
CameraLookAt(0, 0, 0, 0)
MoveCamera(0, 0, 0, 263) 
f.f=0.1
Repeat
  Event = WaitWindowEvent(1)
  If 0=Event
    CreateLine3D(0, 0,   0, 0, RGB(255, 0, 0), 100.0, 0,     0, RGB(0, 0, 255))
    CreateLine3D(1, 0,   0, 0, RGB(255, 0, 0), 0,     100.0, 0, RGB(0, 0, 255))
    CreateLine3D(2, 1.0, 0, 0, RGB(255, 0, 0), 1,     f,     0, RGB(255, 0, 0))
    If f<100.0 : f+0.1 : Else : f=0.1 : EndIf 
    RenderWorld()
    FlipBuffers()
  EndIf 
Until Event=#PB_Event_CloseWindow Or (Event=#PB_Event_Menu And EventMenu()=#ESC); ALT-F4 or ESC   
Wie etwas angezeigt wird hängt von den Kameras ab, Doku Camera. Kleinster Wert für .f ist 1.175494e-38, bei einer etwas mehr als 7-stelligen Präzision.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Objekte in Welt Koordinaten.

Beitrag von SMaag »

Wie etwas angezeigt wird hängt von den Kameras ab, Doku Camera. Kleinster Wert für .f ist 1.175494e-38, bei einer etwas mehr als 7-stelligen Präzision.
Das mit der Camera-Entfernung ist mir mittlerweile klar.
Aber die Koordinaten sind dann float bzw double. In der PB Hilfe ist aber X,Y,Z immer ohne Einheit angegeben, was eigentlich INT wäre.
Ich war bisher der Meinung darauf kann man sich verlassen!

Im PB Beispiel Camera PB sind auch floats definiert.
Define.f KeyX, Key

Im Ogre Source camera.cpp (https://github.com/OGRECave/ogre/blob/m ... Camera.cpp)
findet sich oft REAL. Hab aber keine Ahnung was das in C++ bedeutet. Laut Doku die ich gefunden hab, kann das von verschieden Datentypen abgeleitet sein. Kann es sein, dass es bei x32 float ist und bei x64 double? Das würde Sinn machen!
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Objekte in Welt Koordinaten.

Beitrag von SMaag »

scheint also ein single float (4Byte zu sein)!

Komischer Weise gibt es aber bei den OGRE Definitionen noch eine Unterscheidung
zwischen REAL und Float. Was für ein Sinn steckt da dahinter?

Ich hab dies kryptische C Syntax nicht im Kopf und versteh das nicht zu 100%,
Aber es sieht aus, als ob Vector2 sowohl als Vector2 mit Real als auch als Vector2 == Vector2f (also float)
definiert werden kann. Was aber keinen Sinn macht, da REAL als Float vordefiniert wurde.
Das macht nur Sinn, wenn REAL je nach System x32 und x64 zwischen float und double wechselt!

Code: Alles auswählen

Vector2
typedef Vector<2, Real> Ogre::Vector2
Vector2f
typedef Vector<2, float> Ogre::Vector2f
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Objekte in Welt Koordinaten.

Beitrag von Benubi »

Du mußt mit Floats arbeiten und auch hier ist der Raum etwas begrenzter als das volle 32bit Spektrum zulassen würde. Die ganzen optimierten SSE/3DNow etc. Befehele scheinen auch nur 32 Bit floats zu nutzen. Ist eben das schneller bearbeiten da weniger zu laden ist.

Ich glaube der "sichere" Raum beträgt in einer Ogre Szene ca. 150 mio World Units in alle Richtungen, darüber wirds unsicher insbesondere mit Kollisionsabfragen. Aber damit kannst Du eigentlich schon die Welt im Zentimeter oder Meter Bereich "problemlos" darstellen (1 welteinheit = 1 meter). Ein Zentimer wäre dann 0,01 Welt Einheiten. Allerdings schaffst Du es nicht vom Mond zur Erde.

Sofern Du auch einen Weltraum Simulator abziehlst ich denke man sollte das gesamte Sonnensystem in Miniatur darstellen, aber dann in der Renderqueue immer im Hintergrund rendern. Ogre ist vielleicht nicht ganz darauf ausgelegt weil man müsste ja immer die Camera/Spielfigur auf 0,0,0 (in Weltkoordinaten) zurückschieben vor/nach jedem Frame, und ensprechend das ganze Universum herum. Weil man eben sonst irgendwann an die ~150 mio WE Grenze stößt.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Objekte in Welt Koordinaten.

Beitrag von DarkDragon »

SMaag hat geschrieben: 03.11.2023 14:42 Komischer Weise gibt es aber bei den OGRE Definitionen noch eine Unterscheidung
zwischen REAL und Float. Was für ein Sinn steckt da dahinter?
Mathematiker rechnen mit reellen Zahlen. Die Repräsentation im Computer ist im ersten Schritt nicht so wichtig. Durch die Verwendung eines Aliases kann man die Repräsentation schnell ändern, sollte es erforderlich sein.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten