![]() |
Re: Facharbeit - 3D Topographie anzeigen
GLScene_SnapShot_150305.zip ist die aktuellste Version von GLScene, diese ersetzt GLScene_v09b_Full.zip von der ich im Moment nicht sagen kann welche Sachen fehlen bzw. vorhanden sind.
SnapShot bezeichnet die aktuelle Version der Komponenten die immer weiter entwickelt werden. |
Re: Facharbeit - 3D Topographie anzeigen
hi,
danke schonmal - alles geht :bounce1: :dancer: (Das Programm läuft) ich habe versucht, das ganze auf mein Programm (möglichst simpel) zu übertragen. Und beim Kopieren & Starten produziert er folgende Fehler: [Error] Test2a.pas(2): Undeclared identifier: 'TColorVector' [Error] Test2a.pas(2): Undeclared identifier: 'TTexPoint'
Code:
Wo kommen denn die Typen her? ich use die selben klassen, wie du.
procedure Formula(const x, y: Single; var z: Single;
var color: TColorVector; var texPoint: TTexPoint); const Scale = 100; begin z := VectorNorm(x, y); // x & y-Pos vom Array umrechnen z := data_dst_light[Trunc(x * 100), Trunc(y * 100)] / Scale; // nach Höhe einfärben VectorLerp(clrBlue, clrRed, z, color); end; Wenn man auf das HeightField Event OnHeightGet doppelklickt, wird eine neue Prozedur erstellt:
Code:
also statt TColorVector heißt der Variablentyp TVector4f...
procedure TForm1.GLHeightField1GetHeight(Sender: TObject; const x,
y: Single; var z: Single; var color: TVector4f; var texPoint: TTexPoint); begin [Error] Test2a.pas(375): Undeclared identifier: 'TVector4f' [Error] Test2a.pas(375): Undeclared identifier: 'TTexPoint' Gefunden wird er trotzdem nicht... hat das etwas mit den anderen packages zu tun? GLScene7.dpk hab ich installiert, den Rest nicht. |
Re: Facharbeit - 3D Topographie anzeigen
Also eigentlich ist das Programm für dich schon vorbereitet, du musst nur noch das Array füllen...
Delphi-Quellcode:
Dabei sollte beachtet werden dass die Werte 1,5 nicht überschreiten sollten. Also eine Scalierung durchfüren:
procedure TForm1.SetMyArray;
var x, y: Integer; begin for x := 0 to 150 do for y := 0 to 150 do HFData[x, y] := ... GLHeightField1.StructureChanged; // HeightField neu zeichnen end;
Delphi-Quellcode:
max. 150 : 100 = max 1,5
// Datenwerte an HeightField ubergeben
procedure TForm1.Formula(const x, y: Single; var z: Single; var color: TColorVector; var texPoint: TTexPoint); const Scale = 100; // <-------<<< begin z := VectorNorm(x, y); // x & y-Pos vom Array umrechnen z := HFData[Trunc(x * 100), Trunc(y * 100)] / Scale; // nach Höhe einfärben VectorLerp(clrBlue, clrRed, z, color); end; Wegen dem "Fehler" musst du noch die Unit VectorTypes mit einbinden:
Code:
[b][color=#0000AF]uses[/color][/b]
Windows, ..., GLScene, ..., [b][color=#df0000]VectorTypes[/color][/b]; |
Re: Facharbeit - 3D Topographie anzeigen
So ich steig durch. Wird wirklich praktisch :-)
jetzt fehlt nur noch eine Sache: mein Array muss nicht voll sein. Will heißen, dass das Array nicht immer alle 150 Felder beschrieben hat. Manchmal werden auch nur 50x50 gescannt - je nach eingesteller Auflösung. Wie kommt der Apparat also damit klar, wenn ich nur ein kleineres Array habe? das muss doch hier irgendwo passieren:
Code:
Wenn ich alles kapiert habe, müsste ich die Zeile so abändern:
procedure TForm1.Formula(const x, y: Single; var z: Single;
var color: TColorVector; var texPoint: TTexPoint); const Scale = 100; begin z := VectorNorm(x, y); // x & y-Pos vom Array umrechnen z := HFData[Trunc(x * 100), Trunc(y * 100)] / Scale; // nach Höhe einfärben VectorLerp(clrBlue, clrRed, z, color); end; z := HFData[Trunc(x * pos_MaxX / 1.5 ), Trunc(y * pos_MaxX / 1.5 )] / Scale; die pos_Max-Variablen geben an, wie weit das Array beschrieben ist. Also können sie Maximal den Wert 150 haben. |
Re: Facharbeit - 3D Topographie anzeigen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Die Einstellung (1,5) für das HeightField ist für die 3D-Darstellung besser geeignet als 150 (Einstellungssache). Du kannst das Array mit deinen Werten füllen wie du es benötigst ohne Umzurechnen, das wird ja schon gemacht (der Wert von Scale). Das Beispiel zeigt ja wie. An der Procedure "Formula" brauchst du nichts machen. In der procedure TForm1.SetMyArray; kannst du deine Werte setzen... |
Re: Facharbeit - 3D Topographie anzeigen
okay ich bin dabei. Wäre allerdings schön, wenn der Benutzer das Ganze in X- und Y- Richtung seperat Skalieren könnte (Raster unverändert).
Was aber viel wichtiger ist: welche z-Werte soll ich da eingeben? der Datentyp von HFData ist Single. Mein Array data_dst_light hat den Datentyp Integer. Wie wandle ich die Sache um?
Code:
for x := 0 to 150 do
for y := 0 to 150 do HFData[x, y] := data_dst_light[y, x] / ((1 - opt_Contrast) * 255 + 1); |
Re: Facharbeit - 3D Topographie anzeigen
Var Single := Integer oder Var Single := Byte funktioniert, anders herum nicht. Wo ist da das Problem ?
Zun scalieren, das ist so eine Sache, entweder du rechnest es um oder du musst die Ausdehnung des HeightFields anpassen. |
Re: Facharbeit - 3D Topographie anzeigen
wenn ich die Ausdehnung des Fields anpasse, stimmt der Raster ned - dann kann ichs auch gleich sein lassen, oder?
ich kann grad keinen Screenshot machen, weil ich am Akkuaufladen bin. Wo das Problem ist, kann ich nicht sagen:
Code:
data_src_light : Array[0..150,0..150] of Integer; // 0 - 65535
data_dst_light : Array[0..150,0..150] of Integer; //Das ist das Array, das komische Ergebnisse produziert --------------- //Hier wird das SRC-Array umgerechnet, so dass Graustufenwerte ausgegeben werden ( 0 - 255 ) data_dst_light[x,y] := Trunc((255 * (data_src_light[x, y] - data_MinL)) / (data_MaxL - data_MinL)) //(Ergebnis wurde in 2D überprüft und stimmt) --------------- //Hier wird dein GL Array gefüllt HFData[x, y] := data_dst_light[x, y]; Die Standardwerte, auch aus deinem letzten Beispiel sehen vor, dass bis z=150 das ganze nicht übermäßig groß aussieht. Jetzt werden aber doch auch nur Werte bis 255 eingegeben. Trotzdem sieht eine Zeile (y=1; 1<x<150) aus wie eine Autobahn: Die Höhe ist ungefähr 5-10 mal so groß, wie der Array. Wie gesagt: ich kann grad ned testen, sonst würd ich dir einen Screenshot bauen... :) bye !Ravager |
Re: Facharbeit - 3D Topographie anzeigen
Hallo Leute,
die Sache ist fast fertig. Sieht echt gut aus. Bleibt noch ein kleines Problem: ich hab eine 3D-Darstellung mit einem SceneViewer und eine 2D-Darstellung mit Canvas in einem TImage. Beide Steuerelemente befinden sich in einem Panel. Der Benutzer kann von 2D auf 3D umschalten. Dann wird der SceneViewer Visible gemacht, ansonsten ist er versteckt. Problem ist jetzt die Größenänderung: Das Panel verhält sich Korrekt (alle 4 Anchors gehen). Der SceneViewer auch. Aber nur, wenn er visible ist. Findet während 2D-Modus eine Größenänderung des Fensters statt und schaltet man dann auf 3D um, bleibt der SceneViewer klein. Sobalt er wieder sichtbar ist, läuft alles normal aber sonst ignoriert Delphi [akRight] und [akBottom]. Noch schlimmer ist es beim Image. Hier findet überhaupt keine Größenänderung statt. Fehlt vielleicht irgendeine Einstellung der Steuerelemente? oder muss man ein Resize-Ergeinis programmieren, wie in den anderen Porgrammiersprachen? |
Re: Facharbeit - 3D Topographie anzeigen
könnt ihr mir dabei wirklich nicht helfen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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