Created
July 29, 2022 05:43
-
-
Save fedejordan/5c55055d4fb893db18055f72d1c64810 to your computer and use it in GitHub Desktop.
Blog16 - 3D Cube with camera control
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.fedejordan.libgdx3dtest | |
import com.badlogic.gdx.ApplicationAdapter | |
import com.badlogic.gdx.Gdx | |
import com.badlogic.gdx.graphics.Camera | |
import com.badlogic.gdx.graphics.Color | |
import com.badlogic.gdx.graphics.PerspectiveCamera | |
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder | |
import com.badlogic.gdx.graphics.VertexAttributes.Usage | |
import com.badlogic.gdx.graphics.g3d.* | |
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute | |
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight | |
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController | |
class LibGDX3DTest: ApplicationAdapter() { | |
private lateinit var camera: PerspectiveCamera | |
private lateinit var modelBatch: ModelBatch | |
private lateinit var cubeModel: Model | |
private lateinit var cubeModelInstance: ModelInstance | |
private lateinit var environment: Environment | |
private lateinit var cameraInputController: CameraInputController | |
override fun create() { | |
super.create() | |
createCamera() | |
createCameraInput() | |
adjustCameraPosition() | |
adjustCameraRange() | |
createModelBatch() | |
createCubeModel() | |
createCubeModelInstance() | |
createEnvironment() | |
} | |
override fun render() { | |
super.render() | |
clearScreen() | |
updateCamera() | |
renderModelBatch() | |
} | |
override fun dispose() { | |
super.dispose() | |
disposeModelBatch() | |
disposeCubeModel() | |
} | |
// Utils - Create | |
private fun createCamera() { | |
camera = PerspectiveCamera(75f, Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat()) | |
} | |
private fun createCameraInput() { | |
cameraInputController = CameraInputController(camera) | |
Gdx.input.inputProcessor = cameraInputController | |
} | |
private fun adjustCameraPosition() { | |
camera.position?.set(0f, 0f, 3f) | |
camera.lookAt(0f,0f,0f) | |
} | |
private fun adjustCameraRange() { | |
camera.near = 0.1f | |
camera.far = 300f | |
} | |
private fun createModelBatch() { | |
modelBatch = ModelBatch() | |
} | |
private fun createCubeModel() { | |
val modelBuilder = ModelBuilder() | |
val attributes = (Usage.Position or Usage.Normal).toLong() | |
val material = Material(ColorAttribute.createDiffuse(Color.RED)) | |
cubeModel = modelBuilder.createBox(2f, 2f, 2f, material, attributes) | |
} | |
private fun createCubeModelInstance() { | |
cubeModelInstance = ModelInstance(cubeModel, 0f, 0f, 0f) | |
} | |
private fun createEnvironment() { | |
environment = Environment() | |
environment.set(ColorAttribute(ColorAttribute.AmbientLight, 0.3f, 0.3f, 0.3f, 1.0f)) | |
environment.add(DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f)) | |
} | |
// Utils - render | |
private fun clearScreen() { | |
Gdx.gl.glViewport(0, 0, Gdx.graphics.width, Gdx.graphics.height) | |
Gdx.gl.glClearColor(0f, 0f, 0f, 1f) | |
val GL_DEPTH_BUFFER_BIT = 256 | |
val GL_COLOR_BUFFER_BIT = 16384 | |
Gdx.gl.glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT) | |
} | |
private fun updateCamera() { | |
camera.update() | |
cameraInputController.update() | |
} | |
private fun renderModelBatch() { | |
modelBatch.begin(camera) | |
modelBatch.render(cubeModelInstance, environment) | |
modelBatch.end() | |
} | |
// Utils - Dispose | |
private fun disposeModelBatch() { | |
modelBatch.dispose() | |
} | |
private fun disposeCubeModel() { | |
cubeModel.dispose() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment