3D challenge for a special rotation

Everything related to 3D programming
User avatar
TI-994A
Addict
Addict
Posts: 2512
Joined: Sat Feb 19, 2011 3:47 am
Location: Singapore
Contact:

Re: 3D challenge for a special rotation

Post by TI-994A »

NicTheQuick wrote:...don't use operating systems with security holes...
> Windows 10 Vulnerabilities
Texas Instruments TI-99/4A Home Computer: the first home computer with a 16bit processor, crammed into an 8bit architecture. Great hardware - Poor design - Wonderful BASIC engine. And it could talk too! Please visit my YouTube Channel :D
User avatar
DK_PETER
Addict
Addict
Posts: 898
Joined: Sat Feb 19, 2011 10:06 am
Location: Denmark
Contact:

Re: 3D challenge for a special rotation

Post by DK_PETER »

TI-994A wrote:
NicTheQuick wrote:...don't use operating systems with security holes...
> Windows 10 Vulnerabilities
@TI-994A
Your vulnerabilities list is really outdated.
Several patches has been released which makes your list redundant. :wink:

@NicTheQuick
Security holes exists in almost all operating systems..."Almost" every time they plug a security hole - a new unforeseen 'gravelpit' or another exploitation digs forth a new security hole.
Linux and Mac OS are no exception to the rule.
https://www.cvedetails.com/vulnerabilit ... -Os-X.html
https://www.cvedetails.com/vulnerabilit ... ernel.html

Anyway...If a specific OS serves you well...Then use it. 8)
Current configurations:
Ubuntu 20.04/64 bit - Window 10 64 bit
Intel 6800K, GeForce Gtx 1060, 32 gb ram.
Amd Ryzen 9 5950X, GeForce 3070, 128 gb ram.
User avatar
Psychophanta
Addict
Addict
Posts: 4968
Joined: Wed Jun 11, 2003 9:33 pm
Location: Lípetsk, Russian Federation
Contact:

Re: 3D challenge for a special rotation

Post by Psychophanta »

This is a tip to do (and explain) the main of this forum thread:

Code: Select all

InitEngine3D()
InitSprite():InitKeyboard():InitMouse()
OpenWindow(0,0,0,800,600,"tip",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0,#PB_Screen_WaitSynchronization)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/fonts", #PB_3DArchive_FileSystem)
Parse3DScripts()
CreateLight(0,$EEEEEE,4,4,2,#PB_Light_Point)
CreateCamera(0,0,0,100,100):CameraProjectionMode(0,#PB_Camera_Perspective)
MoveCamera(0,0,0,3,#PB_Absolute)
CreateMaterial(0,0,$33EEEE)
CreateMaterial(1,LoadTexture(1,"soil_wall.jpg"))

CreateCylinder(0,0.025,2):TransformMesh(0,0,0,0,1,1,1,90,0,0)
CreateText3D(0,"incl","",0.2,$8899FAFA):MoveText3D(0,-1.2,0,0)
CreateCube(1,0.5)
CreateEntity(0,MeshID(0),MaterialID(0),0,0,0):RotateEntity(0,90,0,0)
CreateEntity(1,MeshID(1),MaterialID(1),0,0,0)

Structure D3DXVECTOR3
  x.f
  y.f
  z.f
EndStructure
Structure Vector3D Extends D3DXVECTOR3
  m.f;<-length(modulo)
EndStructure

Macro RotarSobreEjeGlobalArbitrario(objeto,ejeglobal,angulo); <- rota una entidad alrededor de un eje arbitrario global dado.
  provis.Vector3D
  ConvertWorldToLocalPosition(EntityID(objeto#),ejeglobal#\x+EntityX(objeto#),ejeglobal#\y+EntityY(objeto#),ejeglobal#\z+EntityZ(objeto#)); <- convierte una posición referenciada en la base global de coordenadas hacia una posición referenciada en la base local del objeto
  provis\x=GetX():provis\y=GetY():provis\z=GetZ():provis\m=Sqr(Pow(provis\x,2)+Pow(provis\y,2)+Pow(provis\z,2))
  If provis\m>0.000001
    EntityFixedYawAxis(objeto#,1,provis\x/provis\m,provis\y/provis\m,provis\z/provis\m); <- esta funcion interpreta el eje como local, asi que hay que transformar un vector de global a local
    Yaw(EntityID(objeto#),Degree(angulo#),#PB_Local|#PB_Relative)
    EntityFixedYawAxis(objeto#,0)
  EndIf
EndMacro

v.Vector3D
Repeat
  While WindowEvent():Wend
  ExamineMouse():ExamineKeyboard()
  CursorX.f=MouseX():CursorY.f=MouseY():lmb.b=MouseButton(#PB_MouseButton_Left):rmb.b=MouseButton(#PB_MouseButton_Right)
  mdx.f=MouseDeltaX()/20:mdy.f=MouseDeltaY()/20:mdz.f=MouseWheel()*5
  If rmb
    RotarSobreEjeGlobalArbitrario(1,v,mdx/20)
  Else
    RotateEntity(0,mdy,-mdx,mdz,#PB_Relative)
    v\x=EntityDirectionX(0)
    v\y=EntityDirectionY(0)
    v\z=EntityDirectionZ(0)
    Text3DCaption(0,StrF(w,2)+","+StrF(v\x,2)+","+StrF(v\y,2)+","+StrF(v\z,2))
  EndIf
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
And this is the base program i made in the date commented at head of the code:

Code: Select all

; Rota una entidad alrededor de un eje global dado. Hecho con PB nativo en Febrero 2019.
;/ inits
Global pantallacompleta.b=0,Titulo$="Rota una entidad alrededor de un eje global dado. Hecho con PB nativo en Febrero 2019"
If ExamineDesktops()=0:End:EndIf
Global bitplanes.a=DesktopDepth(0),FRX.u=DesktopWidth(0),FRY.u=DesktopHeight(0),RX.u=FRX,RY.u=FRY,FrecuenciadeMuestreo.u=60
If FRX<1280 Or FRY<720:RX=FRX*2/3:RY=FRY*2/3:Else:RX=1280:RY=720:EndIf
If InitEngine3D(#PB_Engine3D_NoLog,#PB_Compiler_Home+"Compilers\Engine3d.dll")=0
  MessageRequester("Error","The 3D Engine can't be initialized",0):End
EndIf
InitSprite():InitKeyboard():InitMouse()
OpenWindow(0,0,0,RX,RY,Titulo$,#PB_Window_BorderLess|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,RX,RY,1,0,0,#PB_Screen_WaitSynchronization)
Add3DArchive(#PB_Compiler_Home+"examples/3D/Data/Packs/skybox.zip",#PB_3DArchive_Zip)
Enumeration; Camaras
  #Camara
EndEnumeration
Enumeration; Luces
  #Luz
EndEnumeration
Enumeration; Texturas
  #Textura
EndEnumeration
Enumeration; Materiales
  #Material
EndEnumeration
Enumeration; Mallas
  #Objectmalla
EndEnumeration
Enumeration; Entidades
  #Object
EndEnumeration
Enumeration; Nodos
  #Pivotcamara
EndEnumeration
;\
Structure D3DXVECTOR3
  x.f
  y.f
  z.f
EndStructure
Structure Vector3D Extends D3DXVECTOR3
  m.f;<-length(modulo)
EndStructure
Structure BaseVectorial
  i.D3DXVECTOR3
  j.D3DXVECTOR3
  k.D3DXVECTOR3
EndStructure
Macro ProductoEscalar(a,b,ax=x,ay=y,az=z,bx=x,by=y,bz=z)
  (a#\ax#*b#\bx#+a#\ay#*b#\by#+a#\az#*b#\bz#)
EndMacro
Macro getmodulo(v,vx=x,vy=y,vz=z)
  (Sqr#ProductoEscalar(v#,v#,vx#,vy#,vz#,vx#,vy#,vz#))
EndMacro
Macro ProductoVectorial(in1,in2,out,in1x=x,in1y=y,in1z=z,in2x=x,in2y=y,in2z=z,outx=x,outy=y,outz=z); <- Calculates the vectorial product of two 3D vectors. Just modify this procedure to get the vectorial product for 4D, 5D, 6D or any dimension you need.
  out#\outx#=in1#\in1y#*in2#\in2z#-in1#\in1z#*in2#\in2y#
  out#\outy#=in1#\in1z#*in2#\in2x#-in1#\in1x#*in2#\in2z#
  out#\outz#=in1#\in1x#*in2#\in2y#-in1#\in1y#*in2#\in2x#
EndMacro
Procedure.b KeyEdgeDetection(key.a)
  Static pka.a
  If KeyboardPushed(key);<-if current key status is PUSHED
    If pka=0:pka=key:ProcedureReturn 1:EndIf;<-if previous key status was NOT PUSHED, then assign previous state to current one, and EXIT.
  ElseIf pka=key;<-else (if previous key status was PUSHED and current key status is NOT PUSHED):
    pka=0;:ProcedureReturn -1;<-set previous key status to NOT PUSHED.
  EndIf
  ProcedureReturn 0
EndProcedure
Macro TeclaControldecamara(tecla=LeftControl)
  If KeyEdgeDetection(#PB_Key_#tecla#); <- inicia control camara
    pasocam.f=0.01:pasocamincr.f=0.001
  ElseIf KeyboardReleased(#PB_Key_#tecla#)
  ElseIf KeyboardPushed(#PB_Key_#tecla#); <- mover el punto de vista
    ;para desplazar la camara hacia delante, atras, arriba, abajo, izq o der
    If mdx Or mdy Or mdz
      If mmb.b
        MoveNode(#Pivotcamara,mdx,-mdy,0,#PB_Local); o MoveCamera(#Camara,mdx,-mdy,0,#PB_Local) o MoveCamera(#Camara,mdx,-mdy,0,#PB_Relative)
      Else
        RotateNode(#Pivotcamara,-mdy*60,-mdx*60,0,#PB_Relative)
        If mdz
          MoveCamera(#Camara,0,0,-mdz,#PB_Relative)
        EndIf
      EndIf
    ElseIf KeyboardPushed(#PB_Key_Add)
      MoveCamera(#Camara,0,0,-pasocam,#PB_Relative)
      pasocam+pasocamincr
    ElseIf KeyboardPushed(#PB_Key_Subtract)
      MoveCamera(#Camara,0,0,pasocam,#PB_Relative)
      pasocam+pasocamincr
    ElseIf KeyboardPushed(#PB_Key_Pad8)
      MoveCamera(#Camara,0,pasocam,0,#PB_Relative)
      pasocam+pasocamincr
    ElseIf KeyboardPushed(#PB_Key_Pad2)
      MoveCamera(#Camara,0,-pasocam,0,#PB_Relative)
      pasocam+pasocamincr
    ElseIf KeyboardPushed(#PB_Key_Pad6)
      MoveCamera(#Camara,pasocam,0,0,#PB_Relative)
      pasocam+pasocamincr
    ElseIf KeyboardPushed(#PB_Key_Pad4)
      MoveCamera(#Camara,-pasocam,0,0,#PB_Relative)
      pasocam+pasocamincr
    ElseIf KeyboardPushed(#PB_Key_Pad1)
      RotateNode(#Pivotcamara,0,-0.5,0,#PB_Relative)
    ElseIf KeyboardPushed(#PB_Key_Pad7)
      RotateNode(#Pivotcamara,0,0.5,0,#PB_Relative)
    ElseIf KeyboardPushed(#PB_Key_Pad3) Or lmb.b
      RotateNode(#Pivotcamara,0,0,-0.5,#PB_Relative)
    ElseIf KeyboardPushed(#PB_Key_Pad9) Or rmb.b
      RotateNode(#Pivotcamara,0,0,0.5,#PB_Relative)
    EndIf
EndMacro
Macro resetear
  RotateNode(#Pivotcamara,0,0,0,#PB_Absolute)
  MoveCamera(#Camara,0,0,6,#PB_Absolute)
EndMacro
SkyBox("stevecube.jpg")
CreateLight(#luz,$EEEEEE,4,4,2,#PB_Light_Point)
CreateCamera(#Camara,0,0,100,100):CreateNode(#Pivotcamara,0,0,0):AttachNodeObject(#Pivotcamara,CameraID(#Camara)):CameraRange(#Camara,0.1,10000):CameraBackColor(#Camara,$181911)
MoveCamera(#Camara,0,0,6,#PB_Absolute)
If CreateTexture(#Textura,32,32)
  Font.i=LoadFont(#PB_Any,"Arial",8)
  StartDrawing(TextureOutput(#Textura))
  Box(0,0,16,16,RGB(255,0,0))
  Box(16,0,16,16,RGB(0,255,0))
  Box(0,16,16,16,RGB(0,0,255))
  Box(16,16,16,16,RGB(255,255,0))
  DrawingFont(FontID(Font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(6,2,"hola",RGB(0,0,0))
  DrawText(1,14,"mundo",RGB(0,0,0))
  StopDrawing()
EndIf
CreateMaterial(#material,TextureID(#textura))
CreateCube(#Objectmalla,1)
CreateEntity(#Object,MeshID(#Objectmalla),MaterialID(#material),0,0.1581,0);:RotateEntity(#Object,1,20,3)
Macro ObtenerEjeLocalJdeunObjeto(tipo,objeto,vectorY)
  Pitch(tipo#ID(objeto#),90.0,#PB_Local|#PB_Relative)
  vectorY#\x=tipo#DirectionX(objeto#):vectorY#\y=tipo#DirectionY(objeto#):vectorY#\z=tipo#DirectionZ(objeto#)
  Pitch(tipo#ID(objeto#),270.0,#PB_Local|#PB_Relative)
EndMacro
Macro ObtenerBasedeOrientaciondeunObjeto(tipo,objeto,Base); <- el 'tipo' puede ser 'Camera', 'Entity' o 'Light'. 'Base' es del tipo .BaseVectorial
  ;Si se traza un segmento rectilineo desde un punto dado en el espacio ('objeto') hasta el centroide de un cuerpo dado ('objeto'), este segmento determina un plano normal a él, el cual contiene el centroide de 'objeto'.
  ;Lo que hace esta función es rotar 'objeto' alrededor de un eje dado ('fi->') referenciado a una base global de coordenadas.
  ;Dado que el 'objeto' tiene una orientación propia arbitraria, se necesita la base de coordenadas de este 'objeto' respecto a la base de referencia global.
  ;El eje alrededor del cual rota el 'objeto', así como la cantidad angular a rotar, está determinada por un vector angulo dado ('fi->'), o bien, un vector unidad más un valor escalar angular dados.
  ;Para rotar el 'objeto' con referencia a ese plano, el vector 'fi->' hay que referenciarlo a la base de orientación de 'objeto'
  ;Tenemos entonces 3 elementos de entrada a la funcion:
  ;1- un cuerpo en el espacio
  ;2- un punto en el espacio no coincidente con el centroide del cuerpo
  ;3- un vector angulo, o bien, un vector unidad más un valor escalar angular.
  ;'objeto' es la entidad o nodo de la cual debemos conocer su base de coordenadas, es decir su orientación propia 'x', 'y', y 'z' con respecto a la base global.
  ;'fi->' es el vector, dado en coordenadas globales, que hay que referenciar a coordenadas de 'objeto'
  ;'Base#.BaseVectorial\i->' será el vector 'i' de la base de orientación de 'objeto' con respecto al sistema global
  ;'Base#.BaseVectorial\j->' será el vector 'j' de la base de orientación de 'objeto' con respecto al sistema global
  ;'Base#.BaseVectorial\k->' será el vector 'k' de la base de orientación de 'objeto' con respecto al sistema global
  ;Para obtener la base de coordenadas de 'objeto':
  ;Dado que EntityRoll(objeto#,#PB_Absolute|#PB_Engine3D_Raw) nos da el angulo en que Base#\z-> es torsionado, entonces Base#\y-> y Base#\x-> los podremos conocer. Pero de momento no se como, así que hago esto:
  ;giro 'objeto' -90 grados sobre su propio eje 'y' para obtener su eje 'x' , y luego la dejo como estaba:
  Base#\k\x=tipo#DirectionX(objeto#):Base#\k\y=tipo#DirectionY(objeto#):Base#\k\z=tipo#DirectionZ(objeto#)
  ObtenerEjeLocalJdeunObjeto(tipo#,objeto#,Base#\j)
  ProductoVectorial(Base#\k,Base#\j,Base#\i)
  ;Ya tenemos la triada de vectores correspondientes a las base del objeto 'objeto' (Base#\i-> , Base#\j-> y Base#\k-> )
EndMacro
Macro ObtenerVectorReferidoaBasedeCoordenadasDada(Base,fi,local)
  ;Para obtener el vector 'fi' referenciado a esa 'Base':
  local#\x=Base#\i\x*fi#\x+Base#\j\x*fi#\y+Base#\k\x*fi#\z
  local#\y=Base#\i\y*fi#\x+Base#\j\y*fi#\y+Base#\k\y*fi#\z
  local#\z=Base#\i\z*fi#\x+Base#\j\z*fi#\y+Base#\k\z*fi#\z
EndMacro
Macro RotarSobreEjeGlobalArbitrario(objeto,ejeglobal,angulo); <- rota una entidad alrededor de un eje arbitrario global dado.
  provis.Vector3D
  ConvertWorldToLocalPosition(EntityID(objeto#),ejeglobal#\x+EntityX(objeto#),ejeglobal#\y+EntityY(objeto#),ejeglobal#\z+EntityZ(objeto#)); <- convierte una posición referenciada en la base global de coordenadas hacia una posición referenciada en la base local del objeto
  provis\x=GetX():provis\y=GetY():provis\z=GetZ():provis\m=getmodulo(provis)
  If provis\m>0.000001
    EntityFixedYawAxis(objeto#,1,provis\x/provis\m,provis\y/provis\m,provis\z/provis\m); <- esta funcion interpreta el eje como local, asi que hay que transformar un vector de global a local
    Yaw(EntityID(objeto#),Degree(angulo#),#PB_Local|#PB_Relative)
    EntityFixedYawAxis(objeto#,0)
  EndIf
EndMacro
Macro RotarObjetoSobreEjeReferidoaBaseDada(objetoarotar,tipodeobjeto,objeto,vector,angulo); el plano lo establece la base de coordenadas del objeto 'ojo'
  ObtenerBasedeOrientaciondeunObjeto(tipodeobjeto#,objeto#,base.BaseVectorial); <- obtener la base de coordenadas de un objeto
  ObtenerVectorReferidoaBasedeCoordenadasDada(base.BaseVectorial,vector#,eje.Vector3D); <- obtener el vector 'eje', referenciado en la base de coordenadas de 'ojo'.
  RotarSobreEjeGlobalArbitrario(objetoarotar#,eje.Vector3D,angulo#); <- rotar el objeto sobre ese 'eje'
EndMacro
Macro RotarObjetoSobreEjeReferidoaBaseDada1(objetoarotar,tipodeobjeto,objeto,vector,angulo); Pendiente de hacer: con cuaternios, simplificando lo más posible
      ;El cuaternio son 4 escalares: x=a*Sin(fi/2), y=b*Sin(fi/2), z=c*Sin(fi/2), w=Cos(fi/2)
      ;Donde (a,b,c) es el vector unitario sobre el que rota y 'fi' es la magnitud a rotar
      ;Obtenemos el cuaternio:
      qcam.Vector4
      FetchOrientation(CameraID(#Camara),#PB_Absolute):qcam\x=GetX():qcam\y=GetY():qcam\z=GetZ():qcam\w=GetW()
      ficam.f=2*ACos(qcam\w); <- esto es la 'fi', que es la inclinacion respecto al eje 'y' global
      If Abs(qcam\w)<1
        acam.f=qcam\x/Sin(ficam/2); <- valor escalar 'x' del vector unitario de la inclinacion respecto al eje 'y' global
        bcam.f=qcam\y/Sin(ficam/2); <- valor escalar 'y' del vector unitario de la inclinacion respecto al eje 'y' global
        ccam.f=qcam\z/Sin(ficam/2); <- valor escalar 'z' del vector unitario de la inclinacion respecto al eje 'y' global
      Else
        acam.f=0
        bcam.f=0
        ccam.f=0
      EndIf
      ; NOTA: (acam,bcam,ccam) ES LA UNIDAD VECTOR-ANGULO DEL CUERPO RESPECTO AL VECTOR GLOBAL (0,1,0), SIENDO 'ficam' LA AMPLITUD DE DICHO ANGULO.
      ;Obtenemos el cuaternio:
      qent.Vector4
      FetchOrientation(EntityID(objeto#),#PB_Absolute):qent\x=GetX():qent\y=GetY():qent\z=GetZ():qent\w=GetW()
      fient.f=2*ACos(qent\w); <- esto es la 'fi', que es la inclinacion respecto al eje 'y' global
      If Abs(qent\w)<1
        aent.f=qent\x/Sin(fient/2); <- valor escalar 'x' del vector unitario de la inclinacion respecto al eje 'y' global
        bent.f=qent\y/Sin(fient/2); <- valor escalar 'y' del vector unitario de la inclinacion respecto al eje 'y' global
        cent.f=qent\z/Sin(fient/2); <- valor escalar 'z' del vector unitario de la inclinacion respecto al eje 'y' global
      Else
        aent.f=0
        bent.f=0
        cent.f=0
      EndIf
      ; NOTA: (aent,bent,cent) ES LA UNIDAD VECTOR-ANGULO DEL CUERPO RESPECTO AL VECTOR GLOBAL (0,1,0), SIENDO 'fient' LA AMPLITUD DE DICHO ANGULO.
      
;       debug acam
;       debug bcam
;       debug ccam
      debug aent
      debug bent
      debug cent

      debug "----------"
      
      ;Introducimos este cuaternio modificado por el valor de 'THETA' al objeto:
      ;fient.f=0
      SetOrientation(EntityID(objeto#),acam.f*Sin(ficam/2),bcam.f*Sin(ficam/2),ccam.f*Sin(ficam/2),Cos(ficam/2))
      
EndMacro
Repeat:While WindowEvent()<>#PB_Event_None:Wend
  ExamineMouse():ExamineKeyboard()
  CursorX.f=MouseX():CursorY.f=MouseY():lmb.b=MouseButton(#PB_MouseButton_Left):rmb.b=MouseButton(#PB_MouseButton_Right):mmb.b=MouseButton(#PB_MouseButton_Middle)
  mdx.f=MouseDeltaX()/200:mdy.f=MouseDeltaY()/200:mdz.f=MouseWheel()/20
  TeclaControldecamara(LeftControl)
  ElseIf KeyboardPushed(#PB_Key_F5):resetear
  ElseIf rmb
    MoveEntity(#Object,mdx,-mdy,-mdz,#PB_World|#PB_Relative)
  Else
    THETA.f=Sqr(mdx.f*mdx.f+mdy.f*mdy.f+mdz.f*mdz.f)
    If THETA
      vectordeentrada.Vector3D
      vectordeentrada\x=mdy:vectordeentrada\y=mdx:vectordeentrada\z=mdz:vectordeentrada\m=getmodulo(vectordeentrada)
      RotarObjetoSobreEjeReferidoaBaseDada(#Object,Camera,#Camara,vectordeentrada.Vector3D,THETA)
    EndIf
  EndIf
  TimeSinceLastFrame.i=RenderWorld(50)
  FlipBuffers():Delay(15)
Until KeyboardPushed(#PB_Key_Escape)
http://www.zeitgeistmovie.com

While world=business:world+mafia:Wend
Will never leave this forum until the absolute bugfree PB :mrgreen:
Realizimo
User
User
Posts: 64
Joined: Sun Nov 25, 2012 5:27 pm
Location: Sweden

Re: 3D challenge for a special rotation

Post by Realizimo »

my contribution

Code: Select all

EnableExplicit
#Camara = 3
#Entity = 3
#node= 3
#Light = 3
#Texture = 3 
#Material = 3
#Mesh = 3

If ExamineDesktops()=0 : End : EndIf
Global bitplanes.a=DesktopDepth(0)
Global FRX.u=DesktopWidth(0)*0.9
Global FRY.u=DesktopHeight(0)*0.9

If InitEngine3D(#PB_Engine3D_NoLog,#PB_Compiler_Home+"Compilers\Engine3d.dll")=0
  MessageRequester("Error","The 3D Engine can't be initialized",0)
  End
EndIf
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0,0,0,FRX,FRY,"special rotation",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,FRX,FRY,1,0,0,#PB_Screen_WaitSynchronization)
Add3DArchive(#PB_Compiler_Home+"examples/3D/Data/Packs/skybox.zip",#PB_3DArchive_Zip)
SkyBox("stevecube.jpg")
CreateLight(#Light,$EEEEEE,4,4,2,#PB_Light_Point)
CreateCamera(#Camara,0,0,100,100)
CreateNode(#node,0,0,0)
CameraRange(#Camara,0.1,10000)
CameraBackColor(#Camara,$181911)
MoveCamera(#Camara,0,0,6,#PB_Absolute)
If CreateTexture(#Texture,32,32)
  Global Font.i=LoadFont(#PB_Any,"Arial",8)
  StartDrawing(TextureOutput(#Texture))
  Box(0,0,16,16,RGB(255,0,0))
  Box(16,0,16,16,RGB(0,255,0))
  Box(0,16,16,16,RGB(0,0,255))
  Box(16,16,16,16,RGB(255,255,0))
  DrawingFont(FontID(Font))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,3,"Hello",RGB(0,0,0))
  DrawText(2,15,"World",RGB(0,0,0))
  StopDrawing()
EndIf
CreateNode(#node,0,0,0)
CreateMaterial(#material,TextureID(#Texture))
CreateCube(#Mesh,1)
CreateEntity(#Entity,MeshID(#Mesh),MaterialID(#material))

Global.f mdx,mdy,mdz,THETA
Global.b lmb,rmb,mmb
#speed=0.01
Repeat
  While WindowEvent() : Wend
  ExamineMouse()
  ExamineKeyboard()
;   lmb=MouseButton(#PB_MouseButton_Left)
  rmb=MouseButton(#PB_MouseButton_Right)
;   mmb=MouseButton(#PB_MouseButton_Middle)
  mdx=MouseDeltaX()*#speed
  mdy=MouseDeltaY()*#speed
  mdz=MouseWheel()*#speed
  If KeyboardPushed(#PB_Key_F5)
    RotateEntity(#Entity, 0,0,0)
    MoveNode(#node,0,0,0, #PB_Absolute)
  ElseIf rmb
    MoveNode(#node , mdx , -mdy , -mdz*30)    
  Else    
    DetachNodeObject(#node, EntityID(#Entity)) 
    MoveEntity      (#Entity,0,0,0,#PB_Absolute)
    AttachNodeObject(#node, EntityID(#Entity))
    RotateNode      (#node, mdy*10 , mdx*10 , mdz*300)
  EndIf
  RenderWorld()
  FlipBuffers()  
Until KeyboardPushed(#PB_Key_Escape)
User avatar
Psychophanta
Addict
Addict
Posts: 4968
Joined: Wed Jun 11, 2003 9:33 pm
Location: Lípetsk, Russian Federation
Contact:

Re: 3D challenge for a special rotation

Post by Psychophanta »

You do not even move de camera. It is evident you have not catched the point of this; i am not able to explain it better than the first tip posted in my last post.
http://www.zeitgeistmovie.com

While world=business:world+mafia:Wend
Will never leave this forum until the absolute bugfree PB :mrgreen:
Post Reply