Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Formel gesucht
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12  Weiter
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Mathe-Forum -> Formel gesucht
 
Autor Nachricht
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 15 Jun 2005 - 17:55:36    Titel:

Ok. Das Schneiden der Geraden ist nur eine halbe Sache, wie ich es gerade festgestellt habe Als Kind hat es mir echt Hirnkrämpfe bereitet, erinnere ich mich.

Damit Du Ahnung hast, beschreibe ich es Dir mal kurz. Die Idee bei der geschichte ist ja die, daß Du als Spieler vor Dir sozusagen den Bildschirm des Benutzers trägst und auf diesem die Objekte, die Du siehst projezierst. Das Schaut in etwa so aus:

Code:

        |         
        |                O
 x -----|----------------O
        |                O
        |                     
 Du Bildschirm                 Objekt.


Mit - ist der Strahl zum Objekt gemeint. D.h. Du schießt durch jeden Bildschirmpunkt einen Strahl und schaust, wo der Auftrifft. Demnach erscheint ein gerade Platte vor Dir krumm wenn Du reine Entfernungen nimmst, denn vom Zentrum ab (z.B. O) oben links und rechts sind die Entfernungen zu den O's auf beiden Seiten größer. D.h. man muß korrigieren.

Von der Seite schaut es so aus

Code:


                          ------------------- O
        -----|------------                    O h
   -----     | h'                             O
x------------|--------------------------------O
Du           Bildschirm                          Objekt

       k                             l


k ist der Abstand des virtuellen Bildschirms vor Dir. k+l ist die von dir Berechnete länge und h' ist die gesuchte Höhe auf dem Bild.

Somit ergibt sich h / k+l = h' / k und somit

h' = h * k / (k+l)

Somit verändert sich die Umrechnung zu

Code:

$height = $height * $scalefactor / $alpha


Hier spielt ein wesentlicher Faktor eine Rolle: Die Länge des Spieler-Richtungsvektors ist 1, denn sin(x)^2+cos(x)^2 = 1. $heigt ist die höhe deiner Objekte. $scalefactor ist der Abstand des Bildschirbs vor dem Spieler.

Probieren mal was in der Größenordnung $height * $scalefactor = 256. Die Skalierung bzgl. der Bildschirmhöhe überlasse ich Dir.
progs
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 13.06.2005
Beiträge: 61

BeitragVerfasst am: 15 Jun 2005 - 17:59:05    Titel:

Ich hab jetzt

$height = $height * $scalefactor / $alpha;

Und egal wie groß/klein der $scalefactor ist, es zeichnet nur eine Linie (http://test.bauer-martin.com/3d/engine.php)
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 15 Jun 2005 - 18:02:02    Titel:

Welchen Wert hast Du für height gesetzt?
progs
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 13.06.2005
Beiträge: 61

BeitragVerfasst am: 15 Jun 2005 - 18:02:17    Titel:

War gerade ein Fehler von mir.

Jetzt zeichnet er aber immer noch eine Rundung, nur anders herum. Aber ich denke, wie wird man nicht wegbekommen. Ist auch ziemlich gering.
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 15 Jun 2005 - 18:41:36    Titel:

Es gibt noch was. Der degreestep ist nichtlinear. D.h. für jeden Bildschirmpunkt muß man den Negungsinkel explizit berechnen. Dafür muß man die Bildschirmbreite (ich nehme mal die Hälfte davon) in der Welt definieren. Sagen wir mal die ist b und wir wollen komplett 2b Breite füllen. Dann entspricht ein Pixel im Bild 2b/320 in der Welt (z.B. für 320 Pixel). Und der entsprechende Neigungswinkel für t Pixel Abweichung vom Zentrum ergibt sich durch tan(al) = 2tb/(320*k). Also al = arctan(2tb/(320*k)).

Somit ändert sich

Code:

 $dx0    = cos($playerdegree+$degree_step * $i);
 $dy0    = sin($playerdegree+$degree_step * $i);


zu

Code:

 $dx0    = cos($playerdegree+atan(2*$i*$bwidth/(320*$scalefactor));
 $dy0    = sin($playerdegree+atan(2*$i*$bwidth/(320*$scalefactor));


Dabei ist $bwidth die halbe bildschirmbreite in der Welt. Es ist sinnvoll die Werte

atan(2*$i*$bwidth/(320*$scalefactor)

für -160 <= i <= 160 in einer Tabelle abzuspeichern, da sie nur einmal berechnet werden müssen.

Das bringt die Rundungen trotzdem nicht raus. Ich denke mal darüber nach. Es ist logisch, daß es die gibt. Du solltest ein wenig mit Parametern spielen. Speziell hilft es glaube ich k groß zu wählen.
progs
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 13.06.2005
Beiträge: 61

BeitragVerfasst am: 16 Jun 2005 - 11:06:01    Titel:

http://test.bauer-martin.com/3d/engine.php

Die Objekte werden immer nur bis zur Mitte des Bildes (Bildbreite) gezeichnet. Danach wird nichts mehr gezeichnet. Egal, wie lang die Objekte sind.
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 16 Jun 2005 - 11:14:15    Titel:

Alles klar. Poste bitte doch nochmal den Code. CVS wäre jetzt was, nicht wahr?
progs
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 13.06.2005
Beiträge: 61

BeitragVerfasst am: 16 Jun 2005 - 11:19:39    Titel:

Zitat:
CVS wäre jetzt was, nicht wahr?


Nicht ganz CVS, aber dennoch Up-To-Date: http://test.bauer-martin.com/3d/code.php
algebrafreak
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 28.10.2004
Beiträge: 4143
Wohnort: Passau

BeitragVerfasst am: 16 Jun 2005 - 11:23:41    Titel:

Ich muß jetzt leider in die Uni. Wenn ich nachmittags wieder da bin, mache ich weiter.
progs
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 13.06.2005
Beiträge: 61

BeitragVerfasst am: 16 Jun 2005 - 11:24:35    Titel:

Ok, vielen Dank schonmal.
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Mathe-Forum -> Formel gesucht
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12  Weiter
Seite 5 von 12

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum