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 1 von 2  1 2      
mimi

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

zentralperspektive(Fluchtpunkt) auf einen Canvas Anwenden ?

  Alt 11. Mai 2010, 19:42
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:
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
Sorry, für die Unordnung. Es ist ein Test Code und noch nicht ausgereift. Der Code für "PaintObj1" sieht so aus:

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:
pw:=((MyRect[i].Width*fy) div 100);
ph:=((MyRect[i].Height*fy) div 100);
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.

Delphi-Quellcode:
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
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:
http://www.gorenfeld.net/lou/pseudo/#basics
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Patrick L.

Registriert seit: 22. Mär 2009
10 Beiträge
 
FreePascal / Lazarus
 
#2

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 00:04
Zitat von mimi:
Ich würde gerne das Prinzip verstehen, was dahinter steckt. Sonst könnte ich auch einfach GLSCene oder Direkt OpenGL verwenden.
Welches Prinzip?

Das der 3D-Grafik oder Pseudo-3D
Patrick
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 00:32
Zitat:
Sonst könnte ich auch einfach GLSCene oder Direkt OpenGL verwenden. Das wäre jedoch Langweilig
Ich versichere dir, GLScene ist alles andere als langweilig.
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:

Hier findest du auch noch die Grundbegriffe der Berechnung einer perspektivischen Projektion (was ja anscheinend dein Vorhaben ist
  Mit Zitat antworten Zitat
mimi

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

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 01:05
Zitat:
Welches Prinzip?

Das der 3D-Grafik oder Pseudo-3D
Mir geht es um das Pseudo-3D. Das Prinzip was auch bei z.b. Sykroadas anscheint angewendet wird.
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 . 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.
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
 
#5

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 13:56
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...
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 14:18
Ohne Mathe? Sorry, aber vergiß es. Zumindest Vektoren, Matrizen usw. musst du kennen.
Perspektivische Darstellungen sind Matrizen.

Das sind die GDI Funktionen:
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
mimi

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

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 14:29
Zitat:
Ohne Mathe? Sorry, aber vergiß es
Ich meinte damit eigentlich, nicht die Begriffe sondern der Weg....Den Link schaue ich mir mal an, auch wenn ich unter Lazarus bin und unter Linux bin.

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...
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#8

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 19:43
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...
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#9

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 20:50
Zitat:
Ich weiß das ein Vektoren z.b. ein TPoint sein könnte und eine "Matrizen" könnte ein 2 oder 3D Array sein
Uhm....Ein TPoint ist zweidimensional, ein Vektor hat aber 3 Komponenten, direkt vergleichbar ist das jetzt nicht....so ganz.

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

Rote Pille:
http://wiki.delphigl.com/index.php/Matrix

Blaue Pille:
*klick*


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....
  Mit Zitat antworten Zitat
Namenloser

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

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 13. Mai 2010, 21:08
Zitat von blackfin:
Zitat:
Ich weiß das ein Vektoren z.b. ein TPoint sein könnte und eine "Matrizen" könnte ein 2 oder 3D Array sein
Uhm....Ein TPoint ist zweidimensional, ein Vektor hat aber 3 Komponenten, direkt vergleichbar ist das jetzt nicht....so ganz.
Ein Vektor kann auch 2, 4 oder 100 Komponenten haben. TPoint ist eben ein zweidimensionaler Vektor.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:53 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