A continuación les muestro un ejemplo sobre cómo cargar el modelo de malla del rover
Perseverance que actualmente está en Marte para obtener información del clima y del suelo de este planeta.
Este modelo lo ha puesto a disposición de todos la NASA y está en formato glb.
Si les interesa este tema y quieren ampliar más información sobre el programa de exploración de marte lo pueden consultar
aquí
Los
archivos glb contienen un modelo de un objeto 3D guardado en el formato de transmisión GL (glTF).
Almacena información sobre un modelo 3D, como la jerarquía de nodos, cámaras y materiales, animaciones y mallas en formato binario. Los archivos GLb son la versión binaria de los archivos GLTF.
Los archivos GLB pueden utilizarse para guardar y compartir activos digitales entre diferentes herramientas de modelado 3D, de forma similar a los archivos .DAE. Sin embargo, también están optimizados para la velocidad de descarga y el tiempo de carga en tiempo de ejecución, lo que hace que sean más fáciles de usar en programas de modelado 3D basados en móviles y en la web. También son un formato más racionalizado para cargar y descargar desde bases de datos de activos digitales en línea, como 3D Warehouse y Remix 3D.
Para descargar el modelo usa el componente tNetHTTPClient, ( también se podría utilizar tIdHTTP ), que lo que hace descargar el modelo desde la
URL
https://mars.nasa.gov/system/resourc...rseverance.glb
y almacenarlo en un tMemoryString.
Luego utiliza la clase TGLBModel para crear los nodos, el escalado, los materiales con el fin de crear la hoja de malla que visualizaremos en el tViewPort y que nos permitirá girar, rotar o escalar el modelo del rover.
Dentro del ViewPort se ha definido un componente tLight y un tDummy que contendrá toda la imagen del vehículo.
Lo bueno de utilizar Firemonkey es que de una forma transparente al usuario utiliza la capacidad de cálculo de la GPU del equipo para renderizar la imagen prácticamente en tiempo real.
El código es el siguiente:
unit Perseverance.FMX.Main;
interface
uses
System.SysUtils,
System.Types,
System.UITypes,
System.Classes,
System.Variants,
System.JSON,
FMX.Types,
FMX.Controls,
FMX.Forms,
FMX.Graphics,
FMX.Dialogs,
FMX.StdCtrls,
FMX.Controls.Presentation,
FMX.Edit,
FMX.Objects,
FMX.Layouts,
FMX.Types3D,
System.Net.URLClient,
System.Net.HttpClient,
System.Net.HttpClientComponent,
System.IOUtils,
System.Math.Vectors,
FMX.Controls3D,
FMX.Objects3D,
FMX.Viewport3D,
FMX.MaterialSources,
Execute.GLB.FMX, FMX.TreeView;
type
TMainForm = class(TForm)
Layout1: TLayout;
Text1: TText;
edURL: TEdit;
btGo: TButton;
NetHTTPClient: TNetHTTPClient;
Viewport3D1: TViewport3D;
Light1: TLight;
root: TDummy;
procedure btGoClick(Sender: TObject);
procedure Viewport3D1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
procedure Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Single);
procedure Viewport3D1MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; var Handled: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
FDown: TPointF;
FModel: TGLBFMXModel;
FMesh: TMesh;
FMat: TMaterialSource;
public
{ Déclarations publiques }
end;
var
MainForm: TMainForm;
implementation
{$R *.fmx}
procedure TMainForm.FormCreate(Sender: TObject);
//var
// Stream: TFileStream;
begin
FModel := TGLBFMXModel.Create(Self);
FModel.Parent := root;
// Stream := TFileStream.Create('..\..\..\
VCL\
win32\debug\TEST. GLB', fmOpenRead);
// FModel.LoadFromStream(Stream);
// Stream.Free;
end;
procedure TMainForm.btGoClick(Sender: TObject);
var
GLB: TMemoryStream;
begin
GLB := TMemoryStream.Create;
try
{$IFDEF DEBUG}
if FileExists('Perseverance.glb') then
begin
GLB.LoadFromFile('Perseverance.glb');
end else begin
{$ENDIF}
NetHTTPClient.Get(edURL.Text, GLB);
{$IFDEF DEBUG}
GLB.SaveToFile('Perseverance.glb')
end;
{$ENDIF}
GLB.Position := 0;
FModel.LoadFromStream(GLB);
finally
GLB.Free;
end;
end;
procedure TMainForm.Viewport3D1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
begin
FDown := PointF(X, Y);
end;
procedure TMainForm.Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Single);
begin
if (ssLeft in Shift) then
begin
root.RotationAngle.X := root.RotationAngle.X + (Y - FDown.Y) * 0.3;
root.RotationAngle.Y := root.RotationAngle.Y + (X - FDown.X) * 0.3;
FDown.X := X;
FDown.Y := Y;
end;
if (ssRight in Shift) then
begin
root.Position.Z := root.Position.Z - (Y - FDown.Y) * 0.3;
FDown.Y := Y;
end;
end;
procedure TMainForm.Viewport3D1MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; var Handled: Boolean);
begin
root.Position.Z := root.Position.Z - ((WheelDelta / 120) * 0.3);
end;
end.
------------------
Este sería el diseño del form:
Estructura del programa:
Programa terminado en Firemonkey
Código fuente
Archivo ejecutable
El programa se ha realizado con Delphi 10.4.1
El autor del código es Paul Toth (MVP Embarcadero), su
github es el siguiente:
Suscribirse :
Weiterlesen...