AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia zentralperspektive(Fluchtpunkt) auf einen Canvas Anwenden ?
Thema durchsuchen
Ansicht
Themen-Optionen

zentralperspektive(Fluchtpunkt) auf einen Canvas Anwenden ?

Ein Thema von mimi · begonnen am 11. Mai 2010 · letzter Beitrag vom 15. Mai 2010
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#11

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 21:43
Zudem unterscheidet man in Zeilen und Spaltenvektoren, die jeweils eine Spezialfall der Matrix sind.
Die Lösungen einer homogenen Matrix bilden einen Körper, ...

Und, wie ist dem TE damit geholfen? Gar nicht.


Eine einfache Zentralperspektive kannst du afaik damit erreichen, das du die X- und Y-Koordinaten durch die Z-Koordinate teilst und diese dann auf Null setzt und/oder ignorierst.

(X, Y, Z) -> (X/Z, Y/Z) <- die kannst du jetzt auf dein 2D Koordinatensystem einzeichnen

Damit simulierst du, das du im Koordinatenursprung sitzt und in Z-Richtung guckst.

Was dabei zu beachten ist:
  • Wenn Z < 0 ist, der Punkt also "hinter dir" ist, wird er trotzdem gezeichnet.
    Du solltest solche Fälle also vorher heraus filtern.
  • Wenn du dich (also die Kamera), bewegen/drehen willst, musst du deine Umgebung einfach in die entgegengesetzte Richtung bewegen/drehen (-> Bewegung ist relativ).
    Das solltest du tun, bevor du das oben genannte machst.
Das Drehen und Bewegen macht man ganz gerne mit Matrizen, es geht aber eben auch anders.


Disclaimer:
Größere Denkfehler und Verwirrtheit meinerseits ist möglich, ich würde an deiner Stelle noch keine größere Arbeit darauf verwenden, ohne dass das noch von anderer Seite bestätigt wird.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#12

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 13:47
Danke BUG, die erste Antwort mit der ich möglicherweise auch was Anfangen kann.

Ich weiß nicht warum, aber ich habe extra geschrieben das ICH kein OpenGL verwenden möchte, und trotzdem wird es immer wieder erwähnt, dass ich es tun möchte. Das möchte ich einfach nicht. Ich habe auch extra erwähnt, nicht mit "Mathematischen Ausdrücken und Begriffe" bombardiert zu werden.

Ich finde es recht schade, wie ihr mit solchen fragen umgeht. Warum Antwortet ihr, wenn ihr gar nicht helfen wollt. Dann könnt ihr es auch gleich lassen. Keiner ist z.b. auf meinen Code oder meine wirklichen Fragen eingegangen.

Ich habe das Problem jetzt Vermutlich lösen können. Danke zwei Mitglieder in jeweils zwei IRC-Chanels
*G*. Nun kann ich schon mal ein Flaches Viereck Zeichnen, welches auch eine Tiefe aufweist.

Der erste im IRC hat mir gesagt, ich müsse 3D Punkte auf 2D Abbilden, der zweite konnte dann Dank eines Beitrages denn ich hier gefunden habe, weiter helfen. Die Fertige Funktion, werde ich vermutlich nachher Posten. Ich möchte das noch etwas Optimieren und Verfeinern, damit es auch etwas Deutsches gibt.

Ich finde es, als eine Art Diskriminierung, wie ihr mich hier behandelt bzw. das es kaum brauchbare Seiten auf Deutsch im Internet gibt. Also meine Bitte für die Zunft für mich und andere:
WENN IHR KEINE LUST ODER ZEIT HABT WIRKLICH ZU HELFEN, DANN LÄSST ES EINFACH SEIN.
Weil so bringt das wirklich nichts. Es ist so schwer, auf meine Fragen einzugehen oder es einfach zu lassen ?
Ich hoffe der Thread wird hier jetzt nicht gesperrt, weil ich noch gerne meinen Code, Posten wollte...

PS Das mit TPoint weiß ich, jedoch kann ich auch ein TPoint3D erstellen, welches hat auch x,y und z hat genau das wollte ich damit ausdrücken. Und unter DOS ging das ja auch, die hatten auch kein OPENGL und CO dabei. Also wird es unter canvas erst recht gehen.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 14:55
Ich darf das mal übersetzen: Du fühlst dich diskriminiert, weil du spürst, und man dir indirekt sagt, dass deine Bereitschaft zur eigenständigen Weiterbildung unter aller Kanone ist? Hmm.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#14

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 18:18
Zitat:
Ich darf das mal übersetzen: Du fühlst dich diskriminiert, weil du spürst, und man dir indirekt sagt, dass deine Bereitschaft zur eigenständigen Weiterbildung unter aller Kanone ist?
In was soll der Thread hier enden ? In einem Streit ? Mir zu unterstellen, dass ich keine Bereitschaft habe mich selbst weiter zu bilden, ist eine Behauptung die nicht stimmt.

Gut, ich sehe schon, das war hier meine letzte Frage.

An die BOTS: Bitte den Thread wieder löschen. War ein Fehler hier eine Frage zu Posten.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
elundril

Registriert seit: 11. Feb 2007
Ort: Wien
74 Beiträge
 
#15

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 18:27
Nunja, bei einem Thread bei dem es Computergrafik dazu bitten keine Mathematik zu verwenden ist etwas... optimistisch, um es so zu sagen. Auf der Uni sind solche Vorlesungen von Mathe durchwachsen und das nicht nur um arme studenten zu quälen sondern weil es nötig ist.

Das es kaum brauchbare Seiten auf Deutsch gibt ist deswegen weil eigentlich jeder Erwachsene Englisch können sollte, immerhin ist schlechtes englisch die häufigste Sprache auf der welt. Und um nun seine entdeckung und ähnliches einer breiten masse zur verfügung zu stellen, schreibt man halt in englisch.

Der Hinweis auf OpenGL ist auch durchaus berechtigt, weil man einfach dir versucht nahe zu legen das man das Rad nicht unbedingt neu erfinden muss, es wurde schon erfunden.

lg elundril
Michael
Bombing for peace is like fu**ing for virginity.
--------------
Tausend Lemminge können sich nicht irren.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#16

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 20:49
Also, da ihr mir nicht helfen Wollt oder Glauben wollt hier der Beweis das es doch geht:
Delphi-Quellcode:
unit umy3dtype;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Graphics;

type
  TPoint3D = record
    x,y,z:Integer;
  end; // TPoint3D

  function Point3DTo2D(const x, y, z, a:Integer):TPoint;
  function Point3D(const x,y,z:Integer):TPoint3D;

  procedure Draw3DRect(Canvas:TCanvas; const P1, P2, P3, P4:TPoint3D; const a:Integer; const ViewPoint:TPoint);

implementation

function Point3DTo2D(const x, y, z, a: Integer): TPoint;
begin
  result.x:=(a*x) div z;
  result.y:=(a*y) div z;
end; // Point3DTo2D

function Point3D(const x, y, z: Integer): TPoint3D;
begin
  result.x:=x;
  result.y:=y;
  result.z:=z;
end; // Point3D

procedure Draw3DRect(Canvas:TCanvas; const P1, P2, P3, P4:TPoint3D; const a:Integer; const ViewPoint:TPoint);
var
  TempPoint:TPoint;
  Points:array[0..3] of TPoint;
  px,py:Integer;
begin
// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P1.x, P1.y, P1.z, a);
  Points[1]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);

// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P2.x, P2.y, P2.z, a);
  Points[0]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);

// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P3.x, P3.y, P3.z, a);
  Points[2]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);

// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P4.x, P4.y, P4.z, a);
  Points[3]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);
  Canvas.Polygon(Points)
end; // Draw3DRect

end.

// Angewendet:
  // Rechts
  Draw3DRect(Canvas, Point3D(5,10,10), Point3D(10,10,10), Point3D(5,10,15), Point3D(10,10,15),a, Point(cx, cy));
  // Mitte
  Draw3DRect(Canvas, Point3D(0,10,10), Point3D(-5,10,10), Point3D(0,10,15), Point3D(-5,10,15),a, Point(cx, cy));
  // Links
  Draw3DRect(Canvas, Point3D(-10,10,10), Point3D(-14,10,10), Point3D(-10,10,15), Point3D(-14,10,15),a, Point(cx, cy));
  // Mitte, weiter Vorne
  Draw3DRect(Canvas, Point3D(0,10,5), Point3D(-5,10,5), Point3D(0,10,8), Point3D(-5,10,8),a, Point(cx, cy));
  // Rechts, weiter Vorne
  Draw3DRect(Canvas, Point3D(5,10,5), Point3D(10,10,5), Point3D(5,10,7), Point3D(10,10,7),a, Point(cx, cy));

  Draw3DRect(Canvas, Point3D(5,10,20), Point3D(10,10,20), Point3D(5,10,22), Point3D(10,10,22),a, Point(cx, cy));

  Draw3DRect(Canvas, Point3D(-10,10,20), Point3D(-14,10,20), Point3D(-10,10,22), Point3D(-14,10,22),a, Point(cx, cy));

  Draw3DRect(Canvas, Point3D(0,10,30), Point3D(-5,10,30), Point3D(0,10,36), Point3D(-5,10,36),a, Point(cx, cy));
end; // TMySkyroads.Paint
Das Result sieht ihr im Anhang. Mehr wollte ich am Anfang an eigentlich nicht. Diese Unit habe ich erstellt und die Grundlage hatte ich gestern erstellt, wie gesagt, dankt zwei IRC-Usern.

Edit01: Die Kamara kann ich mit den Pfeiltasten ändern. Wenn ich den A wert entsprechend Anpasse, das passiert im Moment in der KeyDown Methode, meiner Komponente. Die nächste Frage ist: Wie kann ich eine Vereinfachte Funktion schreiben, wo ich nur zwei Punkte angebe: Den Oberen, Linken und den Unteren Rechten. Sonst hätte ich schon eine recht gute Grundlage für mein Vorhaben, oder ? *freu*

edit02: Ich glaube, a ist doch nicht die Kamara.... weil, es wird immer langsamer, wenn ich weiter in die Tiefe gehe.... aber mal schauen.....
Miniaturansicht angehängter Grafiken
bild07_268.png  
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#17

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 23:28
Zitat von mimi:
edit02: Ich glaube, a ist doch nicht die Kamara.... weil, es wird immer langsamer, wenn ich weiter in die Tiefe gehe.... aber mal schauen.....
a dürfte die Brennweite bzw. der Zoom sein.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#18

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 15. Mai 2010, 15:02
Ja... Sieht so aus. Mir sind noch zwei andere Ideen eingefallen(Heute Nacht):
01) Ich mache das so wie in 2D: Ich habe eine ScrollZ Variable, die ich mit 0 Installisiere und anschließend, mache ich überall ScrollZ + Wert
Edit01): Das Problem ist hier bei: Ich kann nicht durch 0 Teilen bzw. Z kann keine Negativen Werte haben. Dann gibt es eine Nette Fehler Meldung:nvalid floating point operation
  Draw3DRect(Canvas, Point3D(0,10,ScrollZ-5), Point3D(-5,10,ScrollZ-5), Point3D(0,10,ScrollZ+0), Point3D(-5,10,ScrollZ+0),a, Point(cx, cy));
02) Ich rechne, den Z Wert Runter. Folgendes Beispiel aus der 2D Welt: Theoretisch, müsste ich bei Top:=400 und einem Rect von 200 ja "nur" 200-Top machen.

Jedoch brauche ich für beide Varianten, eine Sichtbarkeits Prüfung. Ich denke, hier könnte a und ScrollZ eine Große Hilfe sein.... oder ?

Ich finde es erstaunlich, dass es so einfach ist...
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#19

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 15. Mai 2010, 15:29
Habe die Möglichkeiten noch weiter Vereinfacht:
Delphi-Quellcode:
procedure Draw3DRect1(Canvas:TCanvas; const X, Y, W, Z, Deep, A:Integer; const ViewPoint:TPoint);
var
  P1, P2, P3, P4:TPoint3D;
begin
  P1:=Point3D(X,Y,Z);
  P2:=Point3D(X+w,Y,Z);

  P3:=Point3D(X,Y,Z+Deep);
  P4:=Point3D(X+W,Y,Z+Deep);

  Draw3DRect(Canvas, P1,P2, P3, P4, A, ViewPoint);
end; // Draw3DRect
// Anwendung:
Draw3DRect1(Canvas,5, 10, 5, 5, 5, A, Point(cx, cy));
Sieht schon ganz brauchbar aus.... Ich nehme mal an, es liegt an DIV, warum Z keine Negativen Werte haben darf
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz