Skip to content

Instantly share code, notes, and snippets.

@fedejordan
Created July 29, 2022 05:43
Show Gist options
  • Save fedejordan/5c55055d4fb893db18055f72d1c64810 to your computer and use it in GitHub Desktop.
Save fedejordan/5c55055d4fb893db18055f72d1c64810 to your computer and use it in GitHub Desktop.
Blog16 - 3D Cube with camera control
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