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