![]() |
Modelo 3D del vehículo Perseverance realizado con Firemonkey
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 ![]() 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 ![]() 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 ![]() ![]() El programa se ha realizado con Delphi 10.4.1 El autor del código es Paul Toth (MVP Embarcadero), su ![]() Suscribirse : ![]() ![]() ![]() ![]() http://feeds.feedburner.com/~r/Delph...~4/V9RP8rkJQds ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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