ogre Engine3d - Tuch erstellen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ogre Engine3d - Tuch erstellen

Beitrag von bobobo »

das kann Purebasium machen

..
Das wird ja immer besser :mrgreen: :mrgreen:

hier nochmal eine Aufstellung der unterstützen Tasten


Tasten
SPACE piekst ins Tuch
B schiesst einen Ball in Sichtrichtung
ADD (Nummernblock) Gravitation weniger (auch ins negative, dann baumelt das Tuch nach oben)
SUB (Nummernblock) Gravitation mehr
R reset des Tuches

die üblichen Tasten zum Steuern der Kamerabewegung

(eigentlich schade, dass die pointjoints "noch" keine brauchbaren ids haben , dann könnte man damit auch noch rumspielen)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ogre Engine3d - Tuch erstellen

Beitrag von bobobo »

mit Licht und texturierten Bällen (inklusive Timeout)

Code: Alles auswählen

;
;PB 5.21
;sowas wie ein Tuch
;
;Orginal Code von bobobo 



IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
#CameraSpeed = 1


If InitEngine3D(3)
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  maxx=30
  maxy=30
  linienan=0
  
  
  Structure Entities
    id.l
    x.f
    y.f
    z.f
    meshid.l
    matid.l
    scalex.l
    scaley.l
    scalez.l
    phys.l
    lineid1.l
    lineid2.l
  EndStructure
  
  Dim Netz.Entities(maxx,maxy)  ;Netz 10*10
  
    
  NewList ent.Entities()
  Structure balls
    id.l
    time.l
  EndStructure
  
  
  NewList ball.balls()
  
  If Screen3DRequester()
    
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "doscarte.png"))
    ;CreateSphere(0, 0.2,3,3)
    CreateCube(0,0.8)
    CreateSphere(1,3)
    

    For x=0 To maxx
      For y=0 To maxy
        Netz(x,y)\id=id
        Netz(x,y)\lineid1=id
        Netz(x,y)\lineid2=id+(maxx*maxy*2) ; hier Addition eines Wertes, damit es eindeutig wird (bei größeren Netzen anpassen)
        
        id+1
        Netz(x,y)\x=x
        Netz(x,y)\y=y
        Netz(x,y)\z=0
        Netz(x,y)\meshid=MeshID(0)
        If y<maxy
          Netz(x,y)\phys=#PB_Entity_BoxBody
          Netz(x,y)\matid=MaterialID(1)
        Else
          If x=maxx-2 Or x=2
            Netz(x,y)\phys=#PB_Entity_StaticBody
            
          Else
            Netz(x,y)\phys=#PB_Entity_BoxBody
          EndIf
          
          Netz(x,y)\matid=MaterialID(0)
        EndIf
        CreateEntity(Netz(x,y)\id,Netz(x,y)\meshid,Netz(x,y)\matid,Netz(x,y)\x,Netz(x,y)\y,Netz(x,y)\z)
        EntityPhysicBody(Netz(x,y)\id,Netz(x,y)\phys,0.1,0.001,0.001)
        EntityRenderMode(Netz(x,y)\id,#PB_Entity_CastShadow)
      Next y
    Next x
    For x=0 To maxx-1
      For y=0 To maxy
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x+1,y)\id),-1,0,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    For x=0 To maxx
      For y=0 To maxy-1
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x,y+1)\id),0,-1,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 20, 4, 52,1)
    CameraLookAt(0, 15, 15, 0)
    SkyBox("desert07.jpg")
    wg.f=-0.981
    WorldGravity(wg)
    SetWindowTitle(0,StrF(wg,2))
    CreateLight(0, RGB(255, 255, 255), 0, 1, 0,#PB_Light_Directional )  ; Red light
    LightDirection(0, -1, -0.5, -0.25)

    Repeat
      Screen3DEvents()
      WorldGravity(wg)
      WorldShadows(#PB_Shadow_Additive)
      If linienan=1
      For x=0 To maxx-1
        For y=0 To maxy
          CreateLine3D(netz(x,y)\lineid1,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Red,EntityX(Netz(x+1,y)\id),
                       EntityY(Netz(x+1,y)\id),EntityZ(Netz(x+1,y)\id),#Green)
        Next y
      Next x
      For x=0 To maxx
        For y=0 To maxy-1
          CreateLine3D(netz(x,y)\lineid2,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Blue,EntityX(Netz(x,y+1)\id),
                       EntityY(Netz(x,y+1)\id),EntityZ(Netz(x,y+1)\id),#Yellow)
        Next y
      Next x
      EndIf
      
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * 1* 0.05
        MouseY = -MouseDeltaY() * 1 * 0.05
      EndIf
      
      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Space)
              ApplyEntityImpulse(Netz(maxx/2,maxy/2)\id,0,0,-20)
        EndIf
        If KeyboardReleased(#PB_Key_B)
          bally=0
        EndIf
        
        If KeyboardPushed(#PB_Key_B) And bally=0
          bally=1
         AddElement(Ball())
         ball()\id=CreateEntity(#PB_Any,MeshID(1),MaterialID(0),CameraX(0),CameraY(0),CameraZ(0))
         ball()\time=500
          EntityPhysicBody(ball()\id, #PB_Entity_SphereBody,100,1,1 )
          EntityRenderMode(ball()\id,#PB_Entity_CastShadow)
          ApplyEntityImpulse(ball()\id,CameraDirectionX(0)*2000,CameraDirectionY(0)*2000,CameraDirectionZ(0)*2000)
          
        EndIf
        
        ForEach ball()
          ball()\time-1
          If ball()\time<1
            FreeEntity(ball()\id)
            DeleteElement(ball())
          EndIf
        Next
        
        
        If KeyboardPushed(#PB_Key_Subtract)
          wg.f=wg.f-0.1
          
          SetWindowTitle(0,StrF(wg,2))
        EndIf
        If KeyboardPushed(#PB_Key_Add)
          wg.f=wg.f+0.1
          ;WorldGravity(wg)
          SetWindowTitle(0,StrF(wg,2))
        EndIf
        
        If KeyboardPushed(#PB_Key_R)
          For x= 0 To maxx
            For y=0 To maxy
              MoveEntity(Netz(x,y)\id,x,y,z,#PB_Absolute)
              ;ScaleEntity(ye3, 1, 2, 2) 
              
            Next y
          Next x
        EndIf
  
          
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: ogre Engine3d - Tuch erstellen

Beitrag von Purebasium »

Nun wird noch ein Fenster mit Informationen angezeigt.


Code: Alles auswählen

;
;PB 5.21
;sowas wie ein Tuch
;
;Orginal Code von bobobo 





IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
#CameraSpeed = 1


If InitEngine3D(3)
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  maxx=30
  maxy=30
  linienan=0
  maus=0
  
  Structure Entities
    id.l
    x.f
    y.f
    z.f
    meshid.l
    matid.l
    scalex.l
    scaley.l
    scalez.l
    phys.l
    lineid1.l
    lineid2.l
  EndStructure
  
  Dim Netz.Entities(maxx,maxy)  ;Netz 10*10
  
    
  NewList ent.Entities()
  Structure balls
    id.l
    time.l
  EndStructure
  
  
  NewList ball.balls()
  
  If Screen3DRequester()
    
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "doscarte.png"))
    ;CreateSphere(0, 0.2,3,3)
    CreateCube(0,0.8)
    CreateSphere(1,3)
    
 
    For x=0 To maxx
      For y=0 To maxy
        Netz(x,y)\id=id
        Netz(x,y)\lineid1=id
        Netz(x,y)\lineid2=id+(maxx*maxy*2) ; hier Addition eines Wertes, damit es eindeutig wird (bei größeren Netzen anpassen)
        
        id+1
        Netz(x,y)\x=x
        Netz(x,y)\y=y
        Netz(x,y)\z=0
        Netz(x,y)\meshid=MeshID(0)
        If y<maxy
          Netz(x,y)\phys=#PB_Entity_BoxBody
          Netz(x,y)\matid=MaterialID(1)
        Else
          If x=maxx-2 Or x=2
            Netz(x,y)\phys=#PB_Entity_StaticBody
            
          Else
            Netz(x,y)\phys=#PB_Entity_BoxBody
          EndIf
          
          Netz(x,y)\matid=MaterialID(0)
        EndIf
        CreateEntity(Netz(x,y)\id,Netz(x,y)\meshid,Netz(x,y)\matid,Netz(x,y)\x,Netz(x,y)\y,Netz(x,y)\z)
        EntityPhysicBody(Netz(x,y)\id,Netz(x,y)\phys,0.1,0.001,0.001)
        EntityRenderMode(Netz(x,y)\id,#PB_Entity_CastShadow)
      Next y
    Next x
    For x=0 To maxx-1
      For y=0 To maxy
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x+1,y)\id),-1,0,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    For x=0 To maxx
      For y=0 To maxy-1
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x,y+1)\id),0,-1,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 20, 4, 52,1)
    CameraLookAt(0, 15, 15, 0)
    SkyBox("desert07.jpg")
    OpenWindow3D(0,0,0,330,400,"" )
    TextGadget3D(1,0,0,100,20,"FPS:")
    TextGadget3D(2,0,40,300,20,"Tuch besteht derzeit aus ")
    TextGadget3D(3,0,60,300,20,Str(maxy*maxx)+" Elementen")
   ; SpinGadget3D(4,0,100,60,30,5,50) :   SpinGadget3D(5,80,100,60,30,5,50)
     TextGadget3D(6,0,120,300,20,"Space: Tuch piksen  ")
     TextGadget3D(7,0,160,300,20,"B: Einen Ball in Sichtrich-")
     TextGadget3D(8,0,180,300,20,"tung schießen")
     TextGadget3D(9,0,220,300,20,"ADD/SUB (Nummernblock):")
     TextGadget3D(10,0,240,300,20,"Gravitation ändern")
     TextGadget3D(11,0,280,300,20,"R: Reset des Tuches")
     TextGadget3D(12,0,320,330,20,"M: Maus anzeigen/verdecken")
     
    wg.f=-0.981
    WorldGravity(wg)
  ;  SetWindowTitle(0,StrF(wg,2))
    CreateLight(0, RGB(255, 255, 255), 0, 1, 0,#PB_Light_Directional )  ; Red light
    LightDirection(0, -1, -0.5, -0.25)
    

    
    
    Repeat
      Screen3DEvents()
      WorldGravity(wg)
      WorldShadows(#PB_Shadow_Additive)
          SetGadgetText3D(1,"FPS: "+Str(Engine3DFrameRate(#PB_Engine3D_Current)))
      
      
      If linienan=1
      For x=0 To maxx-1
        For y=0 To maxy
          CreateLine3D(netz(x,y)\lineid1,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Red,EntityX(Netz(x+1,y)\id),
                       EntityY(Netz(x+1,y)\id),EntityZ(Netz(x+1,y)\id),#Green)
        Next y
      Next x
      For x=0 To maxx
        For y=0 To maxy-1
          CreateLine3D(netz(x,y)\lineid2,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Blue,EntityX(Netz(x,y+1)\id),
                       EntityY(Netz(x,y+1)\id),EntityZ(Netz(x,y+1)\id),#Yellow)
        Next y
      Next x
      EndIf
      
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * 1* 0.05
        MouseY = -MouseDeltaY() * 1 * 0.05
      EndIf
      
      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Space)
              ApplyEntityImpulse(Netz(maxx/2,maxy/2)\id,0,0,-20)
        EndIf
        If KeyboardReleased(#PB_Key_B)
          bally=0
        EndIf
        
        If KeyboardPushed(#PB_Key_B) And bally=0
          bally=1
         AddElement(Ball())
         ball()\id=CreateEntity(#PB_Any,MeshID(1),MaterialID(0),CameraX(0),CameraY(0),CameraZ(0))
         ball()\time=500
          EntityPhysicBody(ball()\id, #PB_Entity_SphereBody,10,1,1 )
          EntityRenderMode(ball()\id,#PB_Entity_CastShadow)
          ApplyEntityImpulse(ball()\id,CameraDirectionX(0)*200,CameraDirectionY(0)*200,CameraDirectionZ(0)*200)
          
        EndIf
        
        ForEach ball()
          ball()\time-1
          If ball()\time<1
            FreeEntity(ball()\id)
            DeleteElement(ball())
          EndIf
        Next
        
        
        If KeyboardPushed(#PB_Key_Subtract)
          wg.f=wg.f-0.1
          
          SetWindowTitle(0,StrF(wg,2))
        EndIf
        If KeyboardPushed(#PB_Key_Add)
          wg.f=wg.f+0.1
          ;WorldGravity(wg)
          SetWindowTitle(0,StrF(wg,2))
        EndIf
        
        If KeyboardPushed(#PB_Key_R)
          For x= 0 To maxx
            For y=0 To maxy
              MoveEntity(Netz(x,y)\id,x,y,z,#PB_Absolute)
              ;ScaleEntity(ye3, 1, 2, 2) 
              
            Next y
          Next x
        EndIf
  
        
        If KeyboardReleased(#PB_Key_M) 
          If maus = 0 : maus=1 :Else: maus =0 :EndIf
          
          ShowGUI(255,maus) 
          ExamineDesktops()
          MouseLocate(DesktopWidth(0)/2, DesktopHeight(0)/2)
      
          
        EndIf
        
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        
        
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
      
      If maus =0 ;only rotate the camera if the mouse looked
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      EndIf
      
      
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: ogre Engine3d - Tuch erstellen

Beitrag von Purebasium »

Hab noch ein bisschen rumgebastelt

Code: Alles auswählen

;
;PB 5.21
;sowas wie ein Tuch
;
;Orginal Code von bobobo 





IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
#CameraSpeed = 1


If InitEngine3D(3)
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  maxx=30
  maxy=30
  linienan=0
  maus=0
  
  Structure Entities
    id.l
    x.f
    y.f
    z.f
    meshid.l
    matid.l
    scalex.l
    scaley.l
    scalez.l
    phys.l
    lineid1.l
    lineid2.l
  EndStructure
  
  Dim Netz.Entities(maxx,maxy)  ;Netz 10*10
  
    
  NewList ent.Entities()
  Structure balls
    id.l
    time.l
  EndStructure
  
  
  NewList ball.balls()
  
  If Screen3DRequester()
    
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "doscarte.png"))
    ;CreateSphere(0, 0.2,3,3)
    CreateCube(0,0.8)
    CreateSphere(1,3)
    
 
    For x=0 To maxx
      For y=0 To maxy
        Netz(x,y)\id=id
        Netz(x,y)\lineid1=id
        Netz(x,y)\lineid2=id+(maxx*maxy*2) ; hier Addition eines Wertes, damit es eindeutig wird (bei größeren Netzen anpassen)
        
        id+1
        Netz(x,y)\x=x
        Netz(x,y)\y=y
        Netz(x,y)\z=0
        Netz(x,y)\meshid=MeshID(0)
        If y<maxy
          Netz(x,y)\phys=#PB_Entity_BoxBody
          Netz(x,y)\matid=MaterialID(1)
        Else
          If x=maxx-2 Or x=2
            Netz(x,y)\phys=#PB_Entity_StaticBody
            
          Else
            Netz(x,y)\phys=#PB_Entity_BoxBody
          EndIf
          
          Netz(x,y)\matid=MaterialID(0)
        EndIf
        CreateEntity(Netz(x,y)\id,Netz(x,y)\meshid,Netz(x,y)\matid,Netz(x,y)\x,Netz(x,y)\y,Netz(x,y)\z)
        EntityPhysicBody(Netz(x,y)\id,Netz(x,y)\phys,0.1,0.001,0.001)
        EntityRenderMode(Netz(x,y)\id,#PB_Entity_CastShadow)
      Next y
    Next x
    For x=0 To maxx-1
      For y=0 To maxy
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x+1,y)\id),-1,0,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    For x=0 To maxx
      For y=0 To maxy-1
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x,y+1)\id),0,-1,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 63, 38, 38,1)
    CameraLookAt(0, 15, 15, 0)
    SkyBox("desert07.jpg")
    OpenWindow3D(0,0,0,330,450,"" )
    TextGadget3D(1,0,0,100,20,"FPS:")
    TextGadget3D(2,0,40,300,20,"Tuch besteht derzeit aus ")
    TextGadget3D(3,0,60,300,20,Str(maxy*maxx)+" Elementen")
    
    
    ;die Funktion zum verstellen der größe im Programm funkzioniert noch nicht (leider)
    
    ; TextGadget3D(15,0,85,60,20,"Weite"): TextGadget3D(16,140,85,60,20,"Höhe")
   ;  SpinGadget3D(4,60,85,60,30,5,50) :   SpinGadget3D(5,200,85,60,30,5,50)
    
    
     TextGadget3D(6,0,120,300,20,"Space: Tuch piksen  ")
     TextGadget3D(7,0,160,300,20,"B: Einen Ball in Sichtrich-")
     TextGadget3D(8,0,180,300,20,"tung schießen")
     TextGadget3D(9,0,220,300,20,"ADD/SUB (Nummernblock):")
     TextGadget3D(10,0,240,300,20,"Gravitation ändern")
     TextGadget3D(11,0,280,300,20,"R: Reset des Tuches")
     TextGadget3D(12,0,320,330,20,"M: Maus anzeigen/verdecken")
     
     TextGadget3D(13,0,350,300,20,"Ball Geschw."):SpinGadget3D(14,140,350,60,30,1,10)
     
      TextGadget3D(17,0,390,330,20,"P: Pause")
     
     
     
      ;SetGadgetState3D(4, maxx)
    ;  SetGadgetState3D(5, maxy)
      
      
      
     
    wg.f=-0.981
    WorldGravity(wg)
  ;  SetWindowTitle(0,StrF(wg,2))
    CreateLight(0, RGB(255, 255, 255), 0, 1, 0,#PB_Light_Directional )  ; Red light
    LightDirection(0, -1, -0.5, -0.25)
    

    
      SetGadgetState3D(14, 2)
      ShowGUI(255,maus) 
      
    
          
           
    Repeat
      Screen3DEvents()
      WorldGravity(wg)
      WorldShadows(#PB_Shadow_Additive)
          SetGadgetText3D(1,"FPS: "+Str(Engine3DFrameRate(#PB_Engine3D_Current)))
          
     
          
          ;x63
          ;y38
          ;z38
          
          
      If linienan=1
      For x=0 To maxx-1
        For y=0 To maxy
          CreateLine3D(netz(x,y)\lineid1,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Red,EntityX(Netz(x+1,y)\id),
                       EntityY(Netz(x+1,y)\id),EntityZ(Netz(x+1,y)\id),#Green)
        Next y
      Next x
      For x=0 To maxx
        For y=0 To maxy-1
          CreateLine3D(netz(x,y)\lineid2,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Blue,EntityX(Netz(x,y+1)\id),
                       EntityY(Netz(x,y+1)\id),EntityZ(Netz(x,y+1)\id),#Yellow)
        Next y
      Next x
      EndIf
      
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * 1* 0.05
        MouseY = -MouseDeltaY() * 1 * 0.05
      EndIf
      
      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Space)
              ApplyEntityImpulse(Netz(maxx/2,maxy/2)\id,0,0,-20)
        EndIf
        If KeyboardReleased(#PB_Key_B)
          bally=0
        EndIf
        
        If KeyboardPushed(#PB_Key_B) And bally=0
          bally=1
         AddElement(Ball())
         ball()\id=CreateEntity(#PB_Any,MeshID(1),MaterialID(0),CameraX(0),CameraY(0),CameraZ(0))
         ball()\time=500
          EntityPhysicBody(ball()\id, #PB_Entity_SphereBody,10,1,1 )
          EntityRenderMode(ball()\id,#PB_Entity_CastShadow)
          
          geschw=GetGadgetState3D(14)*100
          ApplyEntityImpulse(ball()\id,CameraDirectionX(0)*geschw,CameraDirectionY(0)*geschw,CameraDirectionZ(0)*geschw)
          
        EndIf
        
        
        If pause <>1 ;die runout zeit darf bei pause nicht weiterlaufen
        ForEach ball()
          ball()\time-1
          If ball()\time<1
            FreeEntity(ball()\id)
            DeleteElement(ball())
          EndIf
        Next
        EndIf 
        
        If KeyboardPushed(#PB_Key_Subtract)
          wg.f=wg.f-0.1
          
         ; SetWindowTitle(0,StrF(wg,2))
        EndIf
        If KeyboardPushed(#PB_Key_Add)
          wg.f=wg.f+0.1
          ;WorldGravity(wg)
         ; SetWindowTitle(0,StrF(wg,2))
        EndIf
        
        If KeyboardPushed(#PB_Key_R)
          For x= 0 To maxx
            For y=0 To maxy
              MoveEntity(Netz(x,y)\id,x,y,z,#PB_Absolute)
              ;ScaleEntity(ye3, 1, 2, 2) 
              
            Next y
          Next x
        EndIf
  
        
        If KeyboardReleased(#PB_Key_M) 
          If maus = 0 : maus=1 :Else: maus =0 :EndIf
          
          ShowGUI(255,maus) 
          ExamineDesktops()
          MouseLocate(DesktopWidth(0)/2, DesktopHeight(0)/2)
      
          
        EndIf
        
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        
          If KeyboardReleased(#PB_Key_P) 
          If pause = 0 : pause=1 :Else: pause =0 :EndIf
          EndIf
        
        
        
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
      
      If maus =0 ;only rotate the camera if the mouse looked
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      EndIf
      
      
      MoveCamera  (0, KeyX, 0, KeyY)
      
      
      
      If pause =1
      RenderWorld(0)
      EndIf
        
      If pause <>1
      RenderWorld()
      EndIf 
      
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End

"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ogre Engine3d - Tuch erstellen

Beitrag von bobobo »

BEACHTEN!! Wenn Du den Linien keine eindeutigen ID-Werte gibst, dann weiß Du nicht mehr was Du tust.
Mit linienan=1 entstehen im letzten Code keine Bälle und es fehlt vermutlich noch mehr.
Du setzt die Id der Linien gleich mit den Ids der Würfel. Da beides 3D-Entitites sind klappt das dann nicht
so recht. (Bzw. klappt natürlich alles wie programmiert, allerdings wolltest Du das nicht so programmieren)

Folgendes heilt das , (Auch diese Lösung ist nicht supergut, aber es geht)
Bei theroetisch noch größerer Anzahl der Würfel muss der Wert eventuell nochmal angepasst werden.

Code: Alles auswählen

..
..
Netz(x,y)\lineid1=id+(maxx*maxy*2)
Netz(x,y)\lineid2=id+(maxx*maxy*4)
..
..

Das Infofenster sieht obergruselig aus, wie immer :lol:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: ogre Engine3d - Tuch erstellen

Beitrag von Purebasium »

Ich hab die Linien nie an gemacht da dies bei mir stark ruckelt.
Deshalb hab ich nicht daran gedacht.
:iamwithstupid:

Mit Schatten und allem drum und dran sieht es richtig cool aus, oder?
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ogre Engine3d - Tuch erstellen

Beitrag von bobobo »

Die 3D-Engine taugt halt doch ein wenig was.
aber
wenn dort zu schnell oder konmplex agiert wird, dann mach t die Enige Fehler. Ich glaube dass es daran liegt, dass Sachen die berechnet werden die nicht gleiochzeitig dargestellt werden es klemmt.
hier mal ohne das hässsliche 3D-Gui sondern mit einer sich ändernden Texture.
Drück mal etwas ADD und dann Space (komischerweise wirkt die Änderung der Gravitation nur, wenn sich was bewegt)
schau Dir an wie sich das "Tuch" sich verhält bei der Kollision mit dem Infopanel darüber.

Code: Alles auswählen

;
;PB 5.21
;sowas wie ein Tuch
;
;Orginal Code von bobobo 





IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
#CameraSpeed = 1


If InitEngine3D(3)
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models"  , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts" , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  maxx=30
  maxy=30
  linienan=0
  maus=0
  
  Structure Entities
    id.l
    x.f
    y.f
    z.f
    meshid.l
    matid.l
    scalex.l
    scaley.l
    scalez.l
    phys.l
    lineid1.l
    lineid2.l
  EndStructure
  
  Dim Netz.Entities(maxx,maxy)  ;Netz 10*10
  
    
  NewList ent.Entities()
  Structure balls
    id.l
    time.l
  EndStructure
  
  
  NewList ball.balls()
  
  If Screen3DRequester()
    
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "doscarte.png"))
    CreateCube(0,0.8)
    CreateSphere(1,3)
    infotexture=CreateTexture(#PB_Any,300,150)
    
    fid=LoadFont(#PB_Any,"",8)
    StartDrawing(TextureOutput(infotexture))
      DrawingMode(#PB_2DDrawing_Transparent)
      Box(0,0,100,100,RGBA(0,0,0,0))
      DrawText(0,0,"in der Schleife wird gemalt",#Black)
    StopDrawing()
    CreateMaterial(2,TextureID(infotexture))
    infopanel=CreateEntity(#PB_Any,MeshID(0),MaterialID(2),20,55,0)
    ScaleEntity(infopanel,50,50,5,#PB_Absolute)
    
    EntityPhysicBody(infopanel,#PB_Entity_StaticBody,0.5)
    EntityRenderMode(infopanel,#PB_Entity_DisplaySkeleton)
    ihh=12
    For x=0 To maxx
      For y=0 To maxy
        Netz(x,y)\id=id
        Netz(x,y)\lineid1=id+(maxx*maxy*2)
        Netz(x,y)\lineid2=id+(maxx*maxy*4) ; hier Addition eines Wertes, damit es eindeutig wird (bei größeren Netzen anpassen)
        id+1
        Netz(x,y)\x=x
        Netz(x,y)\y=y
        Netz(x,y)\z=0
        Netz(x,y)\meshid=MeshID(0)
        If y<maxy
          Netz(x,y)\phys=#PB_Entity_BoxBody
          Netz(x,y)\matid=MaterialID(1)
        Else
          If x=maxx-2 Or x=2
            Netz(x,y)\phys=#PB_Entity_StaticBody
            
          Else
            Netz(x,y)\phys=#PB_Entity_BoxBody
          EndIf
          
          Netz(x,y)\matid=MaterialID(0)
        EndIf
        CreateEntity(Netz(x,y)\id,Netz(x,y)\meshid,Netz(x,y)\matid,Netz(x,y)\x,Netz(x,y)\y,Netz(x,y)\z)
        EntityPhysicBody(Netz(x,y)\id,Netz(x,y)\phys,0.1,0.001,0.001)
        EntityRenderMode(Netz(x,y)\id,#PB_Entity_CastShadow)
      Next y
    Next x
    For x=0 To maxx-1
      For y=0 To maxy
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x+1,y)\id),-1,0,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    For x=0 To maxx
      For y=0 To maxy-1
        pj=PointJoint(#PB_Any,EntityID(Netz(x,y)\id),0,0,0,EntityID(Netz(x,y+1)\id),0,-1,0)
        SetJointAttribute(pj,#PB_PointJoint_Damping,1)
        SetJointAttribute(pj,#PB_PointJoint_Tau,1)
      Next y
    Next x
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 63, 38, 38,1)
    CameraLookAt(0, 15, 15, 0)
    SkyBox("desert07.jpg")
    wg.f=-0.981
    WorldGravity(wg)
    CreateLight(0, RGB(255, 255, 255), 0, 1, 0,#PB_Light_Directional )  ; Red light
    LightDirection(0, -1, -0.5, -0.25)
    geschw=200      
           
    Repeat
      Screen3DEvents()
      WorldGravity(wg)
      WorldShadows(#PB_Shadow_Additive)
      If linienan=1
      For x=0 To maxx-1
        For y=0 To maxy
          CreateLine3D(netz(x,y)\lineid1,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Red,EntityX(Netz(x+1,y)\id),
                       EntityY(Netz(x+1,y)\id),EntityZ(Netz(x+1,y)\id),#Green)
        Next y
      Next x
      For x=0 To maxx
        For y=0 To maxy-1
          CreateLine3D(netz(x,y)\lineid2,EntityX(Netz(x,y)\id),EntityY(Netz(x,y)\id),
                       EntityZ(Netz(x,y)\id),#Blue,EntityX(Netz(x,y+1)\id),
                       EntityY(Netz(x,y+1)\id),EntityZ(Netz(x,y+1)\id),#Yellow)
        Next y
      Next x
      EndIf
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * 1* 0.05
        MouseY = -MouseDeltaY() * 1 * 0.05
      EndIf
      
      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Space)
              ApplyEntityImpulse(Netz(maxx/2,maxy/2)\id,0,0,-20)
        EndIf
        If KeyboardReleased(#PB_Key_B)
          bally=0
        EndIf
        If KeyboardPushed(#PB_Key_F)
          geschw+1
        EndIf
        If KeyboardPushed(#PB_Key_G)
          geschw-1
          If geschw<10
            geschw=10
          EndIf
          
        EndIf
        
        If KeyboardPushed(#PB_Key_B) And bally=0
          bally=1
         AddElement(Ball())
         ball()\id=CreateEntity(#PB_Any,MeshID(1),MaterialID(0),CameraX(0),CameraY(0),CameraZ(0))
         ball()\time=500
          EntityPhysicBody(ball()\id, #PB_Entity_SphereBody,10,1,1 )
          EntityRenderMode(ball()\id,#PB_Entity_CastShadow)
          ApplyEntityImpulse(ball()\id,CameraDirectionX(0)*geschw,CameraDirectionY(0)*geschw,CameraDirectionZ(0)*geschw)
        EndIf
        If pause <>1 ;die runout zeit darf bei pause nicht weiterlaufen
        ForEach ball()
          ball()\time-1
          If ball()\time<1
            FreeEntity(ball()\id)
            DeleteElement(ball())
          EndIf
        Next
        EndIf 
        
        If KeyboardPushed(#PB_Key_Subtract)
          wg.f=wg.f-0.1
        EndIf
        If KeyboardPushed(#PB_Key_Add)
          wg.f=wg.f+0.1
        EndIf
        
        If KeyboardPushed(#PB_Key_R)
          For x= 0 To maxx
            For y=0 To maxy
              MoveEntity(Netz(x,y)\id,x,y,z,#PB_Absolute)
            Next y
          Next x
        EndIf
        If KeyboardReleased(#PB_Key_M) 
          ;Hier wir es hässlich
          If maus = 0 : maus=1 :Else: maus =0 :EndIf
          ShowGUI(255,maus) 
          ExamineDesktops()
          MouseLocate(DesktopWidth(0)/2, DesktopHeight(0)/2)
        EndIf
        
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        If KeyboardReleased(#PB_Key_P) 
          If pause = 0 : pause=1 :Else: pause =0 :EndIf
        EndIf
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
      
      If maus =0 ;only rotate the camera if the mouse looked
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      EndIf
      
      MoveCamera  (0, KeyX, 0, KeyY)
      
      If pause =1
      RenderWorld(0)
      EndIf
        
      If pause <>1
        RenderWorld()
      EndIf 
      
      StartDrawing(TextureOutput(infotexture))
        
        DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_AlphaBlend)
        Box(0,0,300,300,RGBA(200,200,255,32))
        ih=0
        FrontColor(RGBA(255,255,0,255))
        BackColor(RGBA(200,200,255,64))
        DrawingFont(FontID(fid))
        DrawText(0,ih,"FPS:"+Str(Engine3DFrameRate(#PB_Engine3D_Current)))
        ih+ihh
        DrawText(0,ih,"Tuch besteht derzeit aus ")
        ih+ihh:DrawText(0,ih,Str(maxy*maxx)+" Elementen")
        ih+ihh:DrawText(0,ih,"Space : Tuch pieksen")
        ih+ihh:DrawText(0,ih,"B: Einen Ball in Sichtrichtung schießen")
        ih+ihh:DrawText(0,ih,"ADD/SUB (Nummernblock): Gravitation ändern")
        ih+ihh:DrawText(0,ih,"Gravitaion :"+StrF(wg,3))
        ih+ihh:DrawText(0,ih,"R: Reset des Tuches")
        ih+ihh:DrawText(0,ih,"M: Maus anzeigen/verdecken")
        ih+ihh:DrawText(0,ih,"Ball Geschw.(f+,g-):"+Str(geschw))
        ih+ihh:DrawText(0,ih,"P: Pause")
        
      StopDrawing()
      CreateMaterial(2,TextureID(infotexture))
      MaterialBlendingMode(2, #PB_Material_AlphaBlend)
      SetEntityMaterial(infopanel,MaterialID(2))
      RotateEntity(infopanel,0,-1,0,#PB_Relative)
      
      Screen3DStats()
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ogre Engine3d - Tuch erstellen

Beitrag von bobobo »

mit Renderworld(240) statt Renderworld() ist die o.a. Ungenauigkeit sehr viel geringer, die Engine rechnet dann
besser, aber das Ergebnis ist auch unflüssiger.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: ogre Engine3d - Tuch erstellen

Beitrag von Chimorin »

Macht doch mal so was

Code: Alles auswählen

frametime = RenderWorld(frametime)
Bild

- formerly known as Bananenfreak -
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ogre Engine3d - Tuch erstellen

Beitrag von bobobo »

dann eher
ft.f=RenderWorld(ft*1.4)

Helfen tut das aber nicht wirklich. Es wird sehr gummiartig.
Die Anzahl der Entities ist halt zu hoch.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten