; ------------------------------------------------------------ ; ; PureBasic - Pendulum waves experiment ; ; (c) Fantaisie Software ; ; ------------------------------------------------------------ ; Thanks to kelebrindae for this nice code. InitEngine3D() InitSprite() InitKeyboard() InitMouse() ExamineDesktops():dx=DesktopWidth(0)*0.8:dy=DesktopHeight(0)*0.8 OpenWindow(0, 0,0, DesktopUnscaledX(dx),DesktopUnscaledY(dy), " Pendulum waves experiment - [Arrows] [Esc] : Quit",#PB_Window_ScreenCentered) OpenWindowedScreen(WindowID(0), 0, 0, dx, dy, 0, 0, 0) Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Main", #PB_3DArchive_FileSystem) Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem) Parse3DScripts() WorldShadows(#PB_Shadow_Additive) ; Texture LoadTexture(1,"Wood.jpg") ; Materials CreateMaterial(1, TextureID(1),$88bbbb) MaterialShininess(1,32,$888888) CreateMaterial(2, 0, $D0B86B) MaterialShininess(2,64,$ffffff) CreateMaterial(3, TextureID(1), $668888) ;MaterialShininess(3,64,$ffffff) ; Entities ; CreatePlane(1, 40, 40, 20, 20, 2,4) sol = CreateEntity(#PB_Any, MeshID(1), MaterialID(1)) CreateCube(2, 1) support = CreateEntity(#PB_Any, MeshID(2), MaterialID(3)) ScaleEntity(support, 20, 0.3, 0.3) MoveEntity(support, 0, 10, 0, #PB_Absolute) support2 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3)) ScaleEntity(support2, 0.4, 12, 0.4) RotateEntity(support2, 30, 0, 0) MoveEntity(support2, 10, 5, -3, #PB_Absolute) support3 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3)) ScaleEntity(support3, 0.4, 12, 0.4) RotateEntity(support3, -30, 0, 0) MoveEntity(support3, 10, 5, 3, #PB_Absolute) support4 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3)) ScaleEntity(support4, 0.4, 12, 0.4) RotateEntity(support4, 30, 0, 0) MoveEntity(support4,-10,5,-3, #PB_Absolute) support5 = CreateEntity(#PB_Any, MeshID(2), MaterialID(3)) ScaleEntity(support5, 0.4, 12, 0.4) RotateEntity(support5, -30, 0, 0) MoveEntity(support5, -10, 5, 3, #PB_Absolute) ; Pendulums #NBPENDULUM = 16 Global Dim sph.i(#NBPENDULUM + 1) Global position.f, stringLength.f CreateSphere(3, 0.5,16,16) For i=1 To #NBPENDULUM stringLength = 980.6 * Pow(15 / ( 2 * #PI * (24 + i) ), 2) position = -9.3 + i * 1.10 ; Create a sphere sph(i) = CreateEntity(#PB_Any, MeshID(3), MaterialID(2)) MoveEntity(sph(i), EntityX(support) + position, EntityY(support) - stringLength,EntityZ(support), #PB_Absolute) CreateEntityBody(sph(i), #PB_Entity_SphereBody) ; Attach the support and the sphere PointJoint(#PB_Any, EntityID(sph(i)), 0, stringLength, 0, 0, position, 0, 0 ) CreateLine3D(100 + i, EntityX(support) + position, EntityY(support), EntityZ(support), $77FF00, EntityX(sph(i)), EntityY(sph(i)), EntityZ(sph(i)), $77FF00) ; Gently push the sphere ApplyEntityImpulse(sph(i),0,0,4) Next ; Camera CreateCamera(0, 0, 0, 100, 100) MoveCamera(0, 16, 12, 16, #PB_Absolute) CameraLookAt(0, 0, 5, 0) ; Light AmbientColor($888888) CreateLight(0,$ffffff, -200,200, 000) ;- Main loop Define.f KeyX, KeyY,keyz,dist, MouseX, MouseY,dist Repeat While WindowEvent():Wend ExamineMouse() ExamineKeyboard() MouseX = -MouseDeltaX() * 0.05 MouseY = -MouseDeltaY() * 0.05 keyx=(-Bool(KeyboardPushed(#PB_Key_Left))+Bool(KeyboardPushed(#PB_Key_Right)))*0.2 keyz=(-Bool(KeyboardPushed(#PB_Key_Down))+Bool(KeyboardPushed(#PB_Key_Up )))*0.2+MouseWheel():dist+(keyz-dist)*0.1 RotateCamera(0, MouseY, MouseX, 0, #PB_Relative) MoveCamera (0, KeyX, keyy, -dist) ; Redraw the line3D to figure the prendulums' strings For i=1 To #NBPENDULUM position = -9.3 + i * 1.10 CreateLine3D(100 + i, EntityX(support) + position, EntityY(support), EntityZ(support), $77FF00, EntityX(sph(i)), EntityY(sph(i)), EntityZ(sph(i)), $77FF00) Next i RenderWorld() FlipBuffers() Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1