; ; ------------------------------------------------------------ ; ; PureBasic - Pendulum waves experiment ; ; (c) Fantaisie Software ; ; ------------------------------------------------------------ ; Спасибо kelebrindae за этот хороший код. #PB_Material_AmbientColor = 2 IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb" #CameraSpeed = 0.4 If InitEngine3D() InitSprite() InitKeyboard() InitMouse() If Screen3DRequester() ; Текстуры ; CreateTexture(0, 128, 128) StartDrawing(TextureOutput(0)) Box(0, 0, 128, 128, $FFFFFF) StopDrawing() CreateTexture(1, 128, 128) StartDrawing(TextureOutput(1)) Box(0, 0, 128, 128, $000000) Box(0, 0, 64, 64, $BBBBBB) Box(64, 64, 64, 64, $BBBBBB) StopDrawing() ; Материалы ; CreateMaterial(1, TextureID(1)) SetMaterialColor(1, #PB_Material_AmbientColor, #PB_Material_AmbientColors) CreateMaterial(2, TextureID(0)) SetMaterialColor(2, #PB_Material_AmbientColor, $D0B86B) CreateMaterial(3, TextureID(0)) SetMaterialColor(3, #PB_Material_AmbientColor, $0077FF) ; Сущности ; CreatePlane(1, 40, 40, 20, 20, 15, 15) sol = CreateEntity(#PB_Any, MeshID(1), MaterialID(1)) CreateEntityBody(sol, #PB_Entity_StaticBody) 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) CreateEntityBody(support, #PB_Entity_StaticBody) 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) CreateEntityBody(support2, #PB_Entity_StaticBody) 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) CreateEntityBody(support3, #PB_Entity_StaticBody) 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) CreateEntityBody(support2, #PB_Entity_StaticBody) 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) CreateEntityBody(support5, #PB_Entity_StaticBody) ; Маятники #NBPENDULUM = 16 Global Dim sph.i(#NBPENDULUM + 1) Global position.f, stringLength.f CreateSphere(3, 0.5) For i=1 To #NBPENDULUM stringLength = 980.6 * Pow(15 / ( 2 * #PI * (24 + i) ), 2) position = -9.3 + i * 1.10 ; Создать сферу 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) ; Прикрепите опору и сферу PointJoint(#PB_Any, EntityID(support), position, 0, 0, EntityID(sph(i)), 0, stringLength, 0) CreateLine3D(100 + i, EntityX(support) + position, EntityY(support), EntityZ(support), $77FF00, EntityX(sph(i)), EntityY(sph(i)), EntityZ(sph(i)), $77FF00) ; Осторожно нажмите на сферу ApplyEntityImpulse(sph(i),0,0,4) Next ; Камера ; CreateCamera(0, 0, 0, 100, 100) MoveCamera(0, 0, 12, 20, #PB_Absolute) CameraLookAt(0, 0, 5, 0) ; Свет ; AmbientColor(RGB(105, 105, 105)) CreateLight(0,RGB(160, 160, 255), 0, 300, 0) WorldShadows(#PB_Shadow_Additive) ; - Главный цикл angle.f = 0 angle2.f = 0 Repeat Screen3DEvents() ;- F1, F2 : Сменить вид If ExamineKeyboard() If KeyboardReleased(#PB_Key_F2) MoveCamera(0, -15, 2.5, 0, #PB_Absolute) CameraLookAt(0, 0, 3, 0) EndIf If KeyboardReleased(#PB_Key_F3) MoveCamera(0, 0, 12, 20, #PB_Absolute) CameraLookAt(0, 0, 5, 0) EndIf ; - Возврат: Показать FPS If KeyboardReleased(#PB_Key_Return) MessageRequester("Инфо", "FPS = " + Str(Engine3DStatus(#PB_Engine3D_AverageFPS))) EndIf EndIf ; Перерисовать line3D, чтобы понять строки. 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() Screen3DStats() FlipBuffers() Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1 EndIf Else MessageRequester("Ошибка", "3D Движок не может быть инициализирован", 0) EndIf