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

11

21.08.2003, 20:17

Dann setz doch einfach nett die Entfernung in relation zum Sichtwinkel ;) Der Sichtwinkel ist sowie so abhängig von dem Zoom-Faktor. Dieser geht dann z.B. von 1x - 5x Zoom. Intern Rechnest du mit einem Wert von 0.0f bis 1.0f. Dann kannste den Sichtwinkel einfach Linear Interpolieren. Der Entfernungsvektor wird dann in relation zum Zoom-Faktor gesetzt. Wenn du z.B. eine Entfernung von 16.0f Einheiten hast und einen Zoom-Faktor von 4, dann teile einfach die Entfernung durch den Faktor: 16.0f / 4.0f = 4.0f <- richtige Entfernung

Ich hab aber keine Ahnung ob das auch den richtigen Effekt gibt. Es währe halt einfach nur ein Ansatz.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

21.08.2003, 20:19

Lass doch wirklich zwei ausgesuchte Punkte des Objekts (einer am einen Rand, der andere am anderen Rand) mit allen Matrizen transformieren, und am Ende kannst Du ausrechnen, wie viele Pixel es auf dem Bildschirm breit ist.
Wenn Du die Punkte gut auswählst, wird das klappen.

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

13

21.08.2003, 22:30

klingt gut, aber...

OK, also wenn wir das beides mal so zusammenfassen würden, dass auch der letzte dies versteht, dann würde ich das vielleicht sogar packen. ;)

Die beiden Randpunkte würden mir dann ein gewisses Größenverhältnis zum ViewFrustum liefern, richtig? Damit alleine kann ich doch aber nicht entscheiden, ob nun Details verbessert oder vermindert werden müssen.(?) Das kappiere ich also noch nicht ganz. (tut mir leid, kannst Du noch mal nachlegen)

Das mit dem Zoomfaktor 4x, 5x habe ich auch noch nicht drauf, weil ich nur den Blickwinkel verringere, um den Zoom zu erreichen. Das habe ich gemacht, um die Far und Near-Plane nicht verändern zu müssen.
Ich könnte aber das, was Du oben gesagt hast, auch mit den Winkeln ins Verhältnis setzen...

Ich habe den Abstand der Modelle zur Kamera als Vertorlänge^2 und die Positionsvectiren der Kamera sowie aller Modelle (ist ja klar).
Dann habe ich die Standard-Zoom (unvergrößert) der Kamera:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (!m_bZoomed && m_3DInputInfo.IsButtonPressed('B'))
{
    FLOAT fAspect = m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;
    m_Camera.SetProjParams(10.0f * D3DX_PI/180.0f, fAspect, 1.0f, 300.0f);
    m_pd3dDevice->SetTransform(D3DTS_PROJECTION, m_Camera.GetProjMatrix());
    m_pD3DModelContainer->SetCameraInfo(&m_Camera);
    m_bZoomed = TRUE;
}
else if (m_bZoomed && !m_3DInputInfo.IsButtonPressed('B'))
{
    FLOAT fAspect = m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;
    m_Camera.SetProjParams(m_iProjAngle * D3DX_PI/180.0f, fAspect, 1.0f, 300.0f);
    m_pd3dDevice->SetTransform(D3DTS_PROJECTION, m_Camera.GetProjMatrix());
    m_pD3DModelContainer->SetCameraInfo(&m_Camera);
    m_bZoomed = FALSE;
}

Bei Zoom wird einfach 10° eingestellt, ungezoomed einfach 45°-50°
Die Entfernungen von Kamera zu den Modellen bleiben also gleich.
Nun müsste ich mir wohl eine Art "virtuelle Entfernung" (im gezoomten Zusand) dazudenken?
Dann könnte ich also einfach die Winkel 45/10 = Entfernung/virtuelle Entfernung.
Nach virtuelle Entfernung aufgelößt:
virtuelle Entfernung (gezoomed) = 10 * Entfernung/45. Das ganze noch mal gemacht, um einen Wert zwischen 0 und 1 zu erhalten, dann hätte ich schon mal den Grad der Detailauflösung im Fall des Zoomes.
Und jetzt die eigentliche Bewegung der Modelle von der Kamera weg oder hin zu ihr mit eingerechnet. Da raucht mir der Kopf.
Aber wird das etwa so werden?
Habt Ihr das gemeint?
Danke
Jens

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

21.08.2003, 22:36

Nee, Du brauchst Dich garnicht um irgendwelche Winkel oder so zu kümmern. Du brauchst nur:
- Weltmatrix
- Sichtmatrix
- Projektionsmatrix

Du suchst zwei oder mehr gute Punkte (am besten vier) im Objekt: einen am "linken" Rand, einen am rechten, einen am oberen und einen am unteren.
Dann jagst Du diese Punkte allesamt durch die drei Matrizen. Am Ende rechnest Du es noch in Pixelkoordinaten um (wenn das Ergebnis (0, 0) ist, ist es genau in der Mitte, (-1, 1) ist links oben, (1, -1) ist rechts unten).
Nun kannst Du berechnen, wie viele Pixel das Objekt ungefähr auf dem Bildschirm einnimmt. Daraus kannst Du dann mit irgendeinem Algorithmus die passende Detailstufe errechnen.
Wenn die aktuelle Detailstufe dieser errechneten Detailstufe entspricht, ist alles OK. Ansonsten musst Du eben "umschalten".

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

15

21.08.2003, 22:46

mhmmmh, das ist aber einfach :P

OK, mir fällt das wahrscheinlich nicht ein, weil mir die View- und die ProjectionMatrix nicht ganz klar ist. Aber das macht nix, da komme ich später dahinter.

Gut, das ist super, dass die 3 Matrizen alles übernehmen. Das muss ich mir noch mal langsam durch die Ohren ziehen.
Danke Dir.

Werbeanzeige