androidkotlinaugmented-realityarcoresceneform

How to change camera type to Orthographic in Sceneform Android SDK?


I'd like to use an Orthographic camera when presenting a model in SceneView (without AR). Couldn't find a way to do so in API. Am I missing something or the feature is missing?


Solution

  • ARCore and Sceneform

    As far as I know, there's no native ORTHO method (cube frustum) for camera projection in ARCore / Sceneform at the moment. But you can make it manually using 4x4 Matrix. So, all you need to do is to calculate left, right, top, bottom, near and far properties using the following principles.

    enter image description here

    Here is how your projection matrix 4x4 must look like:

    enter image description here

    Edit: working code where scaleFactor is a value around 1.3 and height/width are properties of the SceneView.

    private fun buildOrthographicMatrix(right: Float,  top: Float, 
                                          far: Float, near: Float): FloatArray {
       val matrix = FloatArray(16)
    
       matrix[0] = 1 / right
       matrix[1] = 0f
       matrix[2] = 0f
       matrix[3] = 0f
    
       matrix[4] = 0f
       matrix[5] = 1 / top
       matrix[6] = 0f
       matrix[7] = 0f
    
       matrix[8] = 0f
       matrix[9] = 0f
       matrix[10] = -2 / (far - near)
       matrix[11] = 0f
    
       matrix[12] = 0f
       matrix[13] = 0f
       matrix[14] = -(far + near) / (far - near)
       matrix[15] = 1f
    
       return matrix
    }
    
    val newMatrix = buildOrthographicMatrix(1f / scaleFactor, 
                                            1f / scaleFactor * height / width, 
                                            30f, 
                                            0.01f)
    
    camera.projectionMatrix = Matrix(newMatrix)