Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

14.11.2012, 21:08

Schon klar. Aber es hat sich so angehört, als wenn du eine Röhre nehmen möchtest und deine Szene dort rein rendern möchtest. Und der Spieler befindet sich in der Röhre und kann einmal rund rum drehen. Und ich dachte es geht nun darum, dass du die Szene so rendern kannst, dass du sie als Textur für die Röhre benutzen kannst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

12

15.11.2012, 16:13

Auch...
Ich möchte die Möglichkeit bieten keinen Shader zu benutzen (was ich dann also vermutlich mit einer Röhre machen muss) allerdings hoffe ich dass diese Art zum Rendern die Einfachere ist...

Edit:
Ich bin auf folgende Seite gestoßen: http://mathworld.wolfram.com/CylindricalProjection.html
Allerdings bin ich sehr schlecht wenn es darum geht rein mathematische Konzepte die ich nicht verstehe praktisch umzusetzen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Helco« (15.11.2012, 16:31)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

15.11.2012, 18:23

Was hat das denn mit einem Shader zu tun? Du willst doch deine Welt in Blender erstellen und vorrendern oder nicht? Darum geht es mir grad. Nicht um das was du hinterher im Spiel damit machst. Oder hat sich das mit dem vorrendern nun erledigt?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

14

15.11.2012, 18:31

Das Vorrendern ist nun erledigt hoffe ich, denn wenn ZGI (das Vorbild zu der gewünschten Technik) Panoramabilder gleicher Struktur verwendet, habe ich anscheinend schon korrekt gerendert.
Nun muss ich lediglich das Bild auch noch korrekt anzeigen können.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

16.11.2012, 13:13

Ich möchte dich ja nicht von deiner Idee abhalten, aber an sich ist es doch das Ziel um welches es geht. Und warum renderst du die Szene dann nicht einfach in eine Textur, welche du in eine Röhre legst und bist damit fertig? Du darfst es dir natürlich gern schwerer machen;) Hinzu kommt, durch das ganze Shaderzeug setzt du bestimmte Grafikkarten voraus. Das kannst du natürlich tun, man sollte aber vielleicht drüber nachdenken auch ältere Modelle zu unterstützen. Wie gesagt, ich glaube du machst es dir grad viel aufwendiger als du müsstest;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

16

16.11.2012, 14:23

Gute Idee nur bin ich jetzt verwirrt - ist die Textur die ich hier habe nicht geeignet um in eine Röhre gelegt zu werden?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

16.11.2012, 15:48

Das Problem ist, dass die Textur nach außen gewölbt ist. Sie müsste aber nach innen gewölbt sein (glaube ich zumindest). Habe es eben selbst mal getestet und sie in Blender einfach in eine Tube gelegt und es sieht merkwürdig aus;) Wie gesagt, gibt es für das legen von Texturkoordinaten die "Cylinder Projection". Da gibt es für das Rendern sicherlich auch Möglichkeiten. Ich denke das ist ja nicht der erste Fall bei dem sowas gewünscht ist.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

18

09.12.2012, 09:07

Hi,
nach langer Zeit mal wieder das gleiche Problem...
Um der Verwirrung zu entgehen, die leider entstanden ist:
- Das Ziel ist eine Welt wie man sie aus diversen älteren Pano-Adventures (z.B.: Zork Großinquisitor/Nemesis) kennt.
- Das heißt man hat eine 3D-Welt bereits vorgerendert zeigt diese mit Verzerrung an, sodass sie perspektivisch korrekt aussieht auch wenn man sich in ihr bewegt (sich dreht), in diesem Fall gleicht die Verzerrung der, die man sieht wenn man sich in einem Zylinder befindet
- Außerdem sind bestimmte Bereiche anklickbar, sodass man die Maus-Position (in Bildschirmkoordinaten) in Texturkoordinaten auf dem Zylinder berechnen muss

Meine Position:
- Die Welt wird korrekt angezeigt (auch mit Rotation), allerdings rendere ich diese in 3D mit erwähntem Zylinder
- Meine nächste Aufgabe ist es also anklickbare Bereiche zu implementieren wofür ich die Texturkoordinaten der Maus brauche.
- Ich habe eine Formel gefunden (in der Zengine von Marisa-Chan) die genau dafür gedacht ist allerdings ist diese ungenau (d.h. die Texturkoordinate (0.5,0.5) bleibt bei verschiedener Rotation nicht an der gleichen Bildposition). Die Berechnung in C++ sieht im Moment folgendermaßen aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FPoint RenderPanorama::TransformMouseCoord (FPoint screenPos)
        {
            float rotX=rotation*-1;
            FPoint screen(1024,768);
            float texW=3619;
            FPoint hscreen (512,384);
            float rad=tanf(23*3.141592653f/180.0f);
            float hddtan=hscreen.y/rad;
            float tanhdd=rad/hscreen.y;
            float rotFactor=texW/360.0f;
            float tmx=atan((screenPos.x-hscreen.x+0.01f)*tanhdd);
            FPoint n;
            n.x=(hddtan*tmx)+rotX*rotFactor;
            if (n.x<0) while(n.x<0) n.x+=texW;
            else if (n.x>texW) while(n.x>texW) n.x-=texW;
            n.x/=texW;  

            tmx=hscreen.y * cos(tmx) * hddtan * tanhdd *2.0f;
            float yk=tmx/screen.y;
            n.y=((screen.y-screenPos.y)*yk)+((screen.y-tmx)/2.0f);
            n.y/=screen.y;

            return n;
        }

Könnt ihr mir dabei helfen die Formel so umzustellen dass das genannte Problem nicht mehr auftritt?

MfG
Helco

Werbeanzeige