Mostrando entradas con la etiqueta CAD. Mostrar todas las entradas
Mostrando entradas con la etiqueta CAD. Mostrar todas las entradas

Simulación del movimiento de los electrones en un campo electrico


Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico.

Como muestra la imagen se ven los electrones saliendo en tiempo real de la placa de color gris hacia la placa de color rojo acelerándose cuando atraviesan el campo eléctrico.

El escenario se puede girar o rotar en todas direcciones para apreciar mejor el movimiento.


Autor:
Email: systemhalt@nm.ru
www.systemhalt.nm.ru


Codigo fuente



Rotaciones en 3D con RAD Studio


En este post veremos cómo crear y rotar una figura en 3D,  utilizando Delphi RAD Studio.

Empezamos desde File – New – Multi-Device Application y
seleccionamos “3D Application”





A continuación vamos añadiendo los componentes básicos:

-     tViewPort3D : será el lienzo donde se mostrará la
animación en 3D.

-    tColorMaterialSource, en la propiedad “Color”
selecciono “Snow”
.
-  tLightMaterialSource, dejamos marcadas las
propiedades como se indica en la imagen: 



Ahora tenemos que indicar la orientación de la luz y la
orientación del observador de la escena.

Añadimos 2 componentes más:

tLight


tCamera






Estos dos últimos componentes tienen unos botones de control
que permiten moverlos en los 3 ejes del espacio.




Y otro botón más que permite cambiar el tamaño de cada una
de las caras del objeto.



Por último sólo nos queda añadir los bloques de la figura
que queremos crear.

En nuestro caso utilizaremos los siguientes:

tRoundcube (el bloque principal), tPlane (será la pantalla)
y dos tDisk correspondientes a las cámaras




Utilizando los controles de orientación tendremos que mover
cada bloque
hasta conseguir lo siguiente:



Ahora sólo nos queda conseguir el movimiento de la figura

Lo haremos utilizando un tTimer y variaremos el ángulo de
rotación.


PROCEDURE TForm1.Timer1Timer(Sender: TObject);


BEGIN


  WITH
RoundCube1.RotationAngle DO


    Point := Point +
Point3D(2, 0, 0);




END;





Activamos el Timer y 
¡¡ ya lo tenemos !!





UNIT Unit1;

INTERFACE

USES
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
System.Math.Vectors, FMX.Types3D, System.Sensors, System.Sensors.Components,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.MaterialSources,
FMX.Objects3D, FMX.Controls3D, FMX.Viewport3D;

TYPE
TForm1 = CLASS(TForm)
Viewport3D1: TViewport3D;
Dummy1: TDummy;
Camera1: TCamera;
Light1: TLight;
RoundCube1: TRoundCube;
Plane1: TPlane;
Disk1: TDisk;
LightMaterialSource1: TLightMaterialSource;
ColorMaterialSource1: TColorMaterialSource;
Disk2: TDisk;
Timer1: TTimer;
PROCEDURE Timer1Timer(Sender: TObject);
PRIVATE
{ Private declarations }
PUBLIC
{ Public declarations }
END;

VAR
Form1: TForm1;

IMPLEMENTATION

{$R *.fmx}


PROCEDURE TForm1.Timer1Timer(Sender: TObject);
BEGIN

WITH RoundCube1.RotationAngle DO
Point := Point + Point3D(2, 0, 0);

END;

END.




Programas Delphi que utilizan OPENGL






1) Generador de curvas de Bezier



Esta aplicación genera un array de vértices utilizados para construir curvas de Bezier. Requiere que la tarjeta gráfica sea compatible con OpenGL.



Codigo fuente y programa








2) Utilización de una Webcam






Utilizando las primitivas OpenGL, permite ver la imagen de una webcam en una rejilla tridimensional, con la posibilidad de cambiar el ángulo de la cámara, la distancia del observador y la rotación de la imagen.











3) Bandera















4) Simulación del movimiento de los electrones































Simulador de circuitos lógicos



Simulador de circuitos con código fuente que permite diseñar circuitos basándose en puertas lógicas: Y, AND, OR, etc.



Una vez que se termina el diseño se puede activar virtualmente para ver su resultado.
Utilizando o no una tabla es posible realizar funciones básicas: sumador, comparador, etc y simular cualquier expresión booleana de una forma fácil.
El autor incluye varios ejemplos:
-Un display de 7 segmentos
-Un multiplicador binario.

Descargar codigo

Autor: Montero-Ribas

Web: ADMR.CAD.Free.fr





Movimiento de un octoedro



Movimiento de un octaedro en pantalla. (No utiliza OpenGL, GlScene)





Codigo fuente










LIBROS:














Rotación de poliedros en el espacio








Simula el movimiento de un objeto sobre los 3 ejes X,Y,Z





Una app para visualizar moléculas







A continuación os presento una app llamada "Molecule Hero" que permite ver moléculas en 3D , su autor es  Pawel Glowacki





Tiene entre otras opciones la posibilidad de mostrar el "modelo de alambre"  p.ej, en el caso de la molécula de la Cafeína sería el siguiente:






La app está disponible en Play Store (abajo tenéis el link) y  el código fuente está en GitHub bajo licencia MIT de código abierto por lo que se puede reutilizar el código indicando su procedencia.

Utiliza la renderización de esferas (para mostrar los átomos de la molécula) en tiempo real, además permite girar desde todos los ángulos el modelo y ver las conexiones entre los diferentes átomos.

Los datos los obtiene desde el "Protein Data Bank" PDB que es el formato estándar de archivo para el intercambio de datos de estructuras de moléculas.

Así que si queréis ver cómo es la molécula de la cafeína, del colesterol o del diamante, entre otras muchas, esta es vuestra app.


Pawel Glowacki formó parte  del equipo de Embarcadero como "Technical Lead for Developer Tools". (D.E.P.)



Link de la app Molecule Hero en Play Store







Rotar un punto en 3D

Rx,Ry,Rz =Ángulo X,Y,Z

X,Y,Z=posición inicial del punto

NX,NY,NZ=posición final del punto

const

PIDiv180 = 0.017453292519943295769236907684886;



procedure Rotate(Rx, Ry, Rz: Double; x, y, z: Double; var Nx, Ny, Nz: Double);

var

TempX: Double;

TempY: Double;

TempZ: Double;

SinX: Double;

SinY: Double;

SinZ: Double;

CosX: Double;

CosY: Double;

CosZ: Double;

XRadAng: Double;

YRadAng: Double;

ZRadAng: Double;

begin

XRadAng := Rx * PIDiv180;

YRadAng := Ry * PIDiv180;

ZRadAng := Rz * PIDiv180;



SinX := Sin(XRadAng);

SinY := Sin(YRadAng);

SinZ := Sin(ZRadAng);



CosX := Cos(XRadAng);

CosY := Cos(YRadAng);

CosZ := Cos(ZRadAng);



Tempy := y * CosY - z * SinY;

Tempz := y * SinY + z * CosY;

Tempx := x * CosX - Tempz * SinX;



Nz := x * SinX + Tempz * CosX;

Nx := Tempx * CosZ - TempY * SinZ;

Ny := Tempx * SinZ + TempY * CosZ;

end;

(* End Of *)




LIBROS:









Modelado 3D con Delphi




Para los entusiastas del modelado 3D aquí tienen un soft realizado en Delphi que permite construir piezas basándose en primitivas simples cilindros, cubos, etc y con las operaciones topológicas habituales como fusión, intersección, recorte, etc...


Permite hacer figuras de alambre, moverla y rotarla desde todos los ejes de coordenadas, hacer simulación del movimiento y pintar con colores cada cara del objeto.



Autor: Montero-Ribas

Licencia: GNU GPL



Descargar programa



Descargar codigo fuente






LIBROS:

Autocad 3D, DIBUJO Y MODELADO

3D con Photoshop

Aprender Maya, nivel avanzado, ejemplos y ejercicios

Aprender 3DS Max 2017 con 100 ejercicios prácticos

Programación en 3D con Java

Aprende Blender, diseño y creatividad











































Reproductor de estructuras moviles





Permite simular, dibujar y animar estructuras móviles y además puede servir de base para la construcción de vuestro propio motor de interacciones físicas.


Para empezar tenéis que ir al primer desplegable y seleccionar "construct", se limpiará la pantalla y haciendo clic sucesivamente iremos dibujando las partículas y sus uniones entre ellas.


Cuando terminemos de dibujar la figura en el primer desplegable hacemos clic sobre "simulate" para iniciar la animación y ver la interacción entre todos los elementos del gráfico.


Posteriormente se puede hacer clic mantenido sobre una partícula cualquiera para moverla.




Autor:


Paul TOTH

http://tothpaul.free.fr



Codigo fuente


























Delphi 3d engine













Os presento a continuación CAST II, un game engine open source gratuito para Delphi y Free Pascal.



Características:

Editor wysiwyg.



Compatibilidad - Bajos requerimientos de sistema, utilizando todo tipo de hardware.



Cross platform, multi API - en la versión actual utiliza DirectX 8.1 para hacer el render, pero el motor gráfico está preparado para utilizar también OpenGL o DX 9. 



Performance - El motor gráfico está diseñado para conseguir el máximo rendimiento.



Para hacer un juego con CAST II se tiene que escribir alguna clase que implemente la lógica del juego, crear artwork y construir niveles en el editor.



Incluye varios subsistemas:

-Editor de escenas

-Mensajería

-Rendering

-Audio

-Física (detector de colisiones y motor físico de terceras partes)

-Gestión de inputs

-Timer

-Gestión de red

-Gui



Tiene dos tipos de licencia:

Mozilla Public License  http://www.mozilla.org/MPL/MPL-1.1.html

o GNU Lesser General Public License 2.1  http://www.opensource.org/licenses/lgpl-license.php



Página del fabricante



Página de descarga del programa







EJEMPLOS



Vegetación
















Paisajes









Editor de partículas









Escena de un lago





 Editor CAST II

 






















Editor de paisajes

 





































































































Chipmunk 2D motor de física bidimensional






Chipmunk 2D es un motor de física bidimensional codificado en C++, que podemos aplicarlo en Delphi utilizando la unit chipmunk.pas que viene incluida en el zip.


Para cada partícula incorpora dos tipos de estructuras: una de ellas guarda su forma (esfera, segmento o polígono) y posición  y la otra almacena la forma en la que interactúa con su entorno (velocidad, elasticidad y fricción), lo que hace que genere simulaciones altamente realistas, como podrán comprobar  en el exe que adjunto.


Mi recomendación es que reduzcan el radio de las esferas dentro del procedure ImgMouseMove hasta hacerlo = 1 y que jueguen con el ratón haciendo clic y moviéndolo para generar miles de esferas.










Enlace | Codigo fuente









         


author:            Scott Lembcke  

 mail:              slembcke@gmail.com     


                                           


 chipmunk version:  5.3.2                  


 license:           MIT                    


 chipmunk homepage:                        


 http://code.google.com/p/chipmunk-physics/


                                           


 header version:    0.99 beta 2            


 date:              2010.12.09             


 header homepage:                           


 http://code.google.com/p/chipmunk-pascal/ 


                                           


-----------
cabeceras escritas por -------------


                                           


           Kemka Andrey aka Andru           


                                           


 mail: dr.andru@gmail.com                  


 JID: 
dr.andru@googlemail.com             


 ICQ:  496929849                           


 www:  http://andru-kun.inf.ua      












Modelando en 3D con Firemonkey

Firemonkey proporciona la capacidad de utilizar modelos de alambre en 3D en los formatos OBJ, DAE y ASE, que son los más utilizados por el software diseñado para ese fin (p.ej blender...)

Para ahorrar tiempo, en vez de crear los modelos nosotros mismos, hay sitios web que los ofrecen de forma gratuita y sin pagar royalties.

Uno de los muchos sites que hay en la red  es www.turbosquid.com









En esa página hay miles de modelos que podremos utilizar en nuestro programa.

Para empezar tenemos que abrir RAD Studio y crear una nueva Multi-Device Application 3D (tienen los pasos a seguir en este post)

La estructura de los componentes será la siguiente:









El componente tModel3D (Model3D1) deberá colgar de un tDummy (DummyScene) y el objeto de malla en formato OBJ lo tendremos que indicar desde la propiedad MeshCollection (lo indico en color amarillo en la imagen superior).

Nos encontraremos con el incoveniente que el componente tModel3D no tiene asignada la propiedad "MaterialSource" por defecto, por lo que la tenemos que asignar en el evento OnCreate:





procedure TForm1.FormCreate(Sender: TObject);
var mesh : TMesh;
begin
for mesh in Model3D1.MeshCollection do
mesh.MaterialSource := LightMaterialSource1;
end;






También tendremos que añadir un manejador de eventos para conseguir que la figura de malla se mueva según la dirección del ratón y haga un zoom cuando se mueva la rueda del ratón:





procedure TForm1.FormGesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
var delta: integer;
begin
if EventInfo.GestureID = igiZoom then
begin
if (not (TInteractiveGestureFlag.gfBegin in EventInfo.Flags))
and (not (TInteractiveGestureFlag.gfEnd in EventInfo.Flags)) then
begin
delta := EventInfo.Distance - UltimaDistancia;
DoZoom(delta > 0);
end;
UltimaDistancia := EventInfo.Distance;
end;
end;






Igualmente hay que manejar los eventos OnMouseDown, OnMouseMove y OnMouseWheel del componente ViewPort3D1





procedure TForm1.MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
Punto := PointF(X, Y);
end;

procedure TForm1.MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Single);
begin
if (ssLeft in Shift) then
begin
DummyCamera.RotationAngle.X := DummyCamera.RotationAngle.X - ((Y - Punto.Y) * ROTATION_STEP);
DummyCamera.RotationAngle.Y := DummyCamera.RotationAngle.Y + ((X - Punto.X) * ROTATION_STEP);
Punto := PointF(X, Y);
end;
end;

procedure TForm1.MouseWheel(Sender: TObject;
Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
DoZoom(WheelDelta > 0);
end;





Después ejecutaremos la aplicación y podremos ver la figura en 3D desde todos los ángulos posibles,

se puede rotar, ampliar, girar, etc... realmente es espectacular lo que hemos conseguido con unas pocas líneas de código.























Descargar el programa







Creando aplicaciones en 3D con Firemonkey

En este post vamos a ver lo fácil que es realizar una aplicación simple en 3D con Firemonkey.

Comenzamos desde el menú File - New - Multi Device Application Delphi - 3D Application








Añadimos un componente llamado tDummy que se comportará como un contenedor de otros componentes en Firemonkey 3D. Este componente es el equivalente al tLayout en el mundo de Firemonkey 2D.


Con tDummy podremos mover, girar, rotar y escalar los objetos que le asociemos y será el objeto del que descenderán casi todos los que coloquemos en el form, esto nos dará una forma muy sencilla de manipular una escena.









Ahora tenemos que seleccionar el componente tSphere y colocarlo de tal forma que cuelgue del componente tDummy.


Seleccionamos tDummy y cambiamos la propiedad Scale X,Y,Z al valor 5.


Desde la vista Structure tiene que quedar así:









Seguidamente seleccionamos el componente tTextureMaterialSource y lo colocamos en el form.


Después hacemos clic en tSphere y asociamos la propiedad "MaterialSource" al componente tTextureMaterialSource.










Ahora tenemos que crear un bitmap para la textura. Este puede ser una imagen en formato jpg, png, bmp, un color sólido, etc.


Pero para crear un efecto espectacular vamos a cargar la imagen de la tierra vista desde el espacio.


Para ello hay que seleccionar el componente tTextureMaterialSource1 y dentro de él hacer clic en Texture - Edit y seleccionar la imagen en formato *.jpg









 Yo la he descargado desde aquí: http://visibleearth.nasa.gov/


Ahora ya podremos ejecutar la aplicación y veremos  el globo terráqueo en 3D,


 


Pero para dar más realismo y hacer que gire  en 3D lo que hay que hacer es crear una animación, que se hace de una forma muy sencilla, añadiendo el componente tFloatAnimation y teniendo la precaución de quede "colgado" del tShpere en la vista de Structure.









Dentro del componente tFloatAnimation modificamos las propiedades que os he marcado en amarillo:


-Duration = 2


-Enabled = True


-Loop = true


-PropertyName = RotationAngle.Y


-StartValue=1


-StopValue=-360





Y eso es todo,  ¡ya tenemos nuestra primera aplicación en 3D ¡



Clic aquí para descargar el programa






























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 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/resources/gltf_files/25042_Perseverance.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

 


El programa se ha realizado con Delphi 10.4.1

El autor del código es Paul Toth (MVP Embarcadero).

El programa (ejecutable y código fuente) está en el github de Paul Toth

Para descargarlo pulsar el botón CODE y en el menú emergente seleccionar "Download.zip"

 



 








Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...