![]() |
zentralperspektive(Fluchtpunkt) auf einen Canvas Anwenden ?
Bei meinen Nachforschungen(Google, IRC-Chanels) habe ich folgende Informationen bekommen:
01) Es wird eine zentralperspektive verwenden. 02) Zu Umsetzung, brauche ich ein "Fluchtpunkt" der auf einen Horizont liegt. 03) Alle Objekte(Die in einer TObjectList drin sind) sollen sich an drei Regeln halten: A) Je dichter das Objekt am Fluchtpunkt ist, desto kleiner soll es gezeichnet werden B) Je dichter das Object am Fluchtpunkt ist, desto mehr soll die Position zum Fluchtpunkt ausgerichtet sein. Leider sind meine Mathematischen Kenntnisse sehr begrenzt. Aus meinen Versuchen ist jedoch folgender Code entstanden:
Delphi-Quellcode:
Sorry, für die Unordnung. Es ist ein Test Code und noch nicht ausgereift. Der Code für "PaintObj1" sieht so aus:
procedure TMySkyroads.Paint;
var i,px,py,pw,ph, dy,my,tx,ty,tw,th,dw,dh,cx,cy:integer; fy:Integer; begin Canvas.Brush.Color:=clBlack; Canvas.FillRect(0,0,Width, Height); px:=0; py:=0; fy:=0; if ScrollY = -1 then ScrollY:=Height-100; // Ein Roter Horizont(Rot) Canvas.Pen.Color:=clRed; cx:=(Width div 2)-1; cy:=150; Canvas.MoveTo(0,cy-1); Canvas.LineTo(Width,cy-1); // Der Zentrierte Fluchtpunkt(Gelb) Canvas.Pen.Color:=clYellow; Canvas.MoveTo(cx,cy); Canvas.LineTo(cx+1,cy); Canvas.Pen.Color:=clLime; Canvas.MoveTo(cx,cy); Canvas.LineTo(0,cy+(Height div 2)); Canvas.MoveTo(cx,cy); Canvas.LineTo(Width,cy+(Height div 2)); { Canvas.Pen.Color:=clRed; Canvas.MoveTo(cx,cy); Canvas.LineTo(cx,cy+Height);} // Das Gitter Zeichnen // Einige Horizontale Linen(Blau) { Canvas.Pen.Color:=clGray; py:=cy; for i:=0 to 30 do begin Canvas.MoveTo(px,py); Canvas.LineTo(px+Width,py); inc(py,10); end; // for Canvas.Pen.Color:=clBlue; px:=-600; for i:=0 to 30 do begin Canvas.MoveTo(cx,cy); Canvas.LineTo(cx+px,cy+Height); inc(px,40); end; // for} // exit; canvas.Font.Color:=clRed; canvas.Font.Size:=16; for i:=0 to Count-1 do begin canvas.Brush.Color:=MyRect[i].BackgrundColor; canvas.Pen.Color:=MyRect[i].BorderColor; px:=MyRect[i].Left; // Aktuelle Zeichen Position py:=ScrollY-MyRect[i].Top; if py-MyRect[i].Height >=cy then begin my:=abs(py); { if (my >=0) and (my <=50) then fy:=100; if (my >=50) and (my <=100) then fy:=70; if (my >=150) and (my <=200) then fy:=40; if (my >=250) and (my <=300) then fy:=30; if (my >=300) and (my <=400) then fy:=20; if (my >=400) and (my <=480) then fy:=10;} // if (my >=0) and (my <=50) then fy:=6; // if (my >=50) and (my <=100) then fy:=5; // if (my >=150) and (my <=200) then fy:=4; if (my >=250) and (my <=260) then fy:=15; // 1 if (my >=260) and (my <=270) then fy:=20; // 2 if (my >=280) and (my <=290) then fy:=25; // 3 if (my >=300) and (my <=310) then fy:=30; // 4 if (my >=310) and (my <=320) then fy:=35; // 5 if (my >=330) and (my <=340) then fy:=40; // 6 if (my >=340) and (my <=350) then fy:=45; // 7 if (my >=350) and (my <=360) then fy:=50; // 8 if (my >=360) and (my <=370) then fy:=55; // 9 if (my >=370) and (my <=380) then fy:=60; // 10 if (my >=390) and (my <=400) then fy:=65; // 11 if (my >=400) and (my <=410) then fy:=70; // 12 if (my >=410) and (my <=420) then fy:=75; // 13 if (my >=420) and (my <=430) then fy:=80; // 14 if (my >=430) and (my <=440) then fy:=85; // 15 if (my >=450) and (my <=460) then fy:=90; // 16 if (my >=460) and (my <=470) then fy:=95; // 17 if (my >=480) and (my <=490) then fy:=100; // 18 pw:=((MyRect[i].Width*fy) div 100); ph:=((MyRect[i].Height*fy) div 100); tx:=Abs(cx - px); //(Round((Width-pw) / 2)); px:=MyRect[i].Left; //Round(py*ScrollY / cy); py:=py; PaintObj1(Rect(px,py,pw,ph),Canvas); end; // PaintObj1(Rect(px+8,py-6,pw+4,ph-6),Canvas); // canvas.Rectangle(px,py,px+pw,py+ph); // canvas.Rectangle(px+8,py-6,px+4+pw,py+ph-6); { canvas.TextStyle.Alignment:=taCenter; canvas.TextStyle.Layout:=tlCenter; canvas.TextRect(Rect(px,py,px+pw, py+ph),px,py,IntTostr(i));} end; // for i end; // TMySkyroads.Paint Mit den Vielen IF Anweisungen, versuche ich einen Wert Bereich zu bestimmen. Ich verwende hier Prozent Angaben(Das hoffe ich jedenfalls). Das kann man hier ganz gut sehen:
Delphi-Quellcode:
Ich denke, das Hauptproblem dürfte daran liegen, dass ich nicht weiß wie ich X und Y anpassen muss bzw. wie der Notwendige Code dafür aussieht.
pw:=((MyRect[i].Width*fy) div 100);
ph:=((MyRect[i].Height*fy) div 100);
Delphi-Quellcode:
Ich habe eine Bitte: Bitte Bombardiert mich NICHT mit Mathematischen ausrücken oder Fachbegriffe. Wenn Möglich. Ich habe schon selbst gesucht mit Goole und FireBall und auch in Verschiedenen Foren. Jedoch habe ich nichts gefunden, was mir weiter geholfen hätte. Eine Seite möchte ich noch angeben:
procedure PaintObj1(const aRect:TRect; canvas:TCanvas);
var d:Integer; begin d:=Round( aRect.Right div 2) div 2; // Die Hälfte von der Hälfte ausrechnen. canvas.MoveTo(aRect.Left+d,aRect.Top+1); canvas.LineTo(aRect.Left+(aRect.Right-d),aRect.Top+1); canvas.MoveTo(aRect.Left,aRect.Top+aRect.Bottom); canvas.LineTo(aRect.Left+aRect.Right,aRect.Top+aRect.Bottom); canvas.MoveTo(aRect.Left+(d),aRect.Top+1); canvas.LineTo(aRect.Left,aRect.Top+aRect.Bottom+1); canvas.MoveTo(aRect.Left+(aRect.Right-d),aRect.Top+1); canvas.LineTo(aRect.Left+aRect.Right,aRect.Top+aRect.Bottom+1); end; // PaintObj1 ![]() Die wurde mir im DelphiGL Chanel genannt. Jedoch auf Englisch. Aber vielleicht hilft es es euch weiter.... Ich würde gerne das Prinzip verstehen, was dahinter steckt. Sonst könnte ich auch einfach GLSCene oder Direkt OpenGL verwenden. Das wäre jedoch Langweilig. Gut, wenn ich direkt mit OpenGL arbeiten würde, würde es wieder Sinn machen. Aber ich möchte es gerne erst mal so versuchen. Die Objekte sollen unterschiedlich groß sein. ich verwende hier noch Begriffe aus der 2D Welt: X und Y sowie die Breite und Höhe. ScrollX wird von KeyDown entsprechend Verändert(Mit den Pfeiltasten hoch und Runter). Wenn ich es richtig verstanden habe, kann ScrollX auch als Kamera bzw als Z Variable bezeichnet werden. |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
Das der 3D-Grafik oder Pseudo-3D |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
Es ist nämlich teilweise so buggy, dass du selbst hart ran musst, um etwas zu implementieren...und dann lernst du ganz gewaltig die Prinzipien von 3D / OpenGL :) Tipp: Wenn dich die Prinzipien von 3D generell interessieren, solltest du dir vielleicht das rote Buch von OpenGL kaufen oder die "GPU Gems"-Geschichten. Was ich auch empfehlen kann ist das Buch "The Cg Tutorial" von nVidia, dass es auch kostenlos als Online-Variante gibt. Auch wenn es da prinzipiell um die Sprache Cg und Shader geht, ist das ganze jedoch so erklärt, dass man die Prinzipien der Geometrie / der technik, die dahinter steckt, sehr einfühlsam mitgeteilt bekommt. Edit: ![]() |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
Mir geht es NICHT um richtiges 3D. Sonst würde ich Entsprechende Schnittstellen nutzen, wo es bereist Implementiert ist. @blackfin Danke für den Link. Ich werde ihn mir anschauen, auch wenn er auf Englisch ist. Ich habe jedoch auch Deutsche Internet Seiten gefunden, jedoch muss man dafür Studiert haben um diese zu verstehen. Daher frage ich mich warum es Leute gibt, die solche Seiten erstellt haben. Welche die Studiert haben, brauchen solche Seiten nämlich nicht. Mein Primäres Problem ist die Mathematik. Ich kann nicht viel. Ich kann gerade mal die Grundrechenarten. Vielleicht noch etwas Prozent und Dreisatz :oops: . Und viele Seiten verwenden leider Formeln mit den ich wirklich nichts anfangen kann. Frage mich bitte nicht auf welcher Schule ich war. Das Thema hatte wir hier schon. Einfach mal noch Suchen. Daher auch meine direkte frage nach: Code Beispielen. Mir ist es egal, in welcher Sprache er geschrieben wurde. Alle Sprachen sind sich ähnlich. Solange er nicht gleich 1000 Zeilen lang ist. Mir geht es um eine einfache Schritt für Schritt Anleitung. Mir ist aufgefallen: Egal wie Kompliziert der Code auch ist: Ich kann ihn für meine Zwecke anpassen. Dabei lerne ich am meisten. |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Was ich gestern noch Vergessen hatte: Erstmal danke für eure Antworten.
Zum Thema Mir ist schon klar, überall gibt es Fachbegriffe. Man kann aber ein Frage / Problem auf verschiedene Art und weißen Erklären bzw. Lösen. Wenn ich euch z.b. sagen würde: Back eurer Brot mit einer TA von 160 sagen wir mal, würdet ihr damit was Anfangen können ? Genau so geht es mir im Moment. Ich denke ihr findet recht schnell hier eine Antwort bei Wikipedia. Nur ich könnte euch auch gleich das Rezept für Pizza Verraten ohne, den Umweg über die TA *G*..... Oder anders: 600g Mehl 200 bis 300g Wasser 1 Hefe etwas Salz etwas Zucker. Aber was für Mehl ? Weizen ? Roggen ? Vollkorn ? Gemischt ? Wobei jedes Mehl auch noch gewisse Besonderheiten hat. Z.B. Roggenmehl. Ich wäre für jeden Tipp Dankbar. Wenn es kein Ganzer Code ist: Vielleicht kleine Rechenwege ? Z.B. die Aussagen: 01) Je dichter das Objekt am Fluchtpunkt(cx, cy) ist, desto Dichter bzw. Zentrierter muss es gezeichnet werden 02) Je dichter das Object am Fluchtpunkt ist, desto Höher(oder ?) muss es gezeichnet werden. Unter DOS hatte, die schließlich auch kein OpenGL und CO zu Verfügung. Sondern "nur" den Grafikmodus 13 bzw. "Interap" 21 ?... Wenn ich direkt OpenGL nehmen würde(Was meine Letzte Möglichkeit wäre um das Problem zu lösen), könnte ich natürlich auch andere Sachen einbauen. Da ist auch was wahres dran... |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Ohne Mathe? Sorry, aber vergiß es. Zumindest Vektoren, Matrizen usw. musst du kennen.
Perspektivische Darstellungen sind Matrizen. Das sind die GDI Funktionen: ![]() |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
Edit01: OK Einigen wir uns auf "Vektoren, Matrizen".... wie würde es damit gehen ? Ich weiß das ein Vektoren z.b. ein TPoint sein könnte und eine "Matrizen" könnte ein 2 oder 3D Array sein... |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
OpenGL Rechnet Grundsätzlich alles in 4x4 Matrizen.
Die W-Komponente wird dann für die Perspektivische Division gemacht. Von GLScene halte ich jetzt nicht so viel, das ist aber bestimmt Geschmackssache. Ich arbeite auch unter Linux und Lazarus, da ist OpenGL mit dem TOpenGLcontrol und der DGLOpenGL.pas wunderbar realisierbar. Mach es wie ich und schau dir erst mal einfache Anwendungen an. Es ist zwar generell gut die Hintergründe zu kennen. Aber es ist eben nicht Notwendig, und unter OpenGL kannst du da durchaus noch deutlich interessantere Dinge machen... |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
Und eine Matrix ist eine Matrix. Vergleichen kannst du diese auch nicht direkt, auch wenn sie ein zweidimensionales Array im Groben darstellt...leider musst dich jetzt schon entscheiden, ob du die blaue oder die rote Pille nimmst :mrgreen: Rote Pille: ![]() Blaue Pille: ![]() Edit: Generell ist ja sehr löblich, wenn du sagst, dass du alles selbst machen willst. Allerdings würde ich an deiner Stelle doch erst einmal mit etwas vorhandenem und fundierten wie OpenGL oder Direct3D experimentieren,bevor du daran gehst, dir selbst eine 3D-Engine ohne diese Elemente zu erstellen. Ein Autoschrauber werkelt auch erstmal an mehreren Autos herum, bevor er sich (wenn überhaupt jemals) eine eigene Karrosserie baut :) So lernt er auch, wie ein Motor und ein Auto überhaupt funktioniert, mit diesem Wissen kann er dann vielleicht iiirgendwann mal, zumindest theoretisch ein eigenes Auto bauen. Macht er das aber nicht, kommt dabei vielleicht ein 40 Tonner mit dem Motor eines Küchenquirls raus und er wundert sich, warum das Ding nicht so tut wie es soll.. Eine andere Tatsache ist ebenso, dass du mit deiner eigenen (pseudo) 3D-Engine niemals die Geschwindigkeit von OpenGL oder Direct3D haben wirst, da du ganz einfach von der Hardware mangels Treiber nicht unterstützt werden wirst :) Aber nun werde ich eh utopisch.... |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
|
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
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:
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. |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
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. |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
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.
|
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
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. |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
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 |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Liste der Anhänge anzeigen (Anzahl: 1)
Also, da ihr mir nicht helfen Wollt oder Glauben wollt hier der Beweis das es doch geht:
Delphi-Quellcode:
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.
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 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..... |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Zitat:
|
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
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
Delphi-Quellcode:
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... |
Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende
Habe die Möglichkeiten noch weiter Vereinfacht:
Delphi-Quellcode:
Sieht schon ganz brauchbar aus.... Ich nehme mal an, es liegt an DIV, warum Z keine Negativen Werte haben darf
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)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz