0
\$\begingroup\$

I'm trying to convert a length (well, a radius) from world coordinates to screen coordinates using an OrthographicCamera. However, the only method I've figured out so far is to do a projection, with some basic vector math before/after, but this seems...expensive.

Here's what I have so far (apologies, written in Kotlin):

val cam: OrthographicCamera = ...
val behavior: SteeringBehavior<Vector2> = ...

// calculating the center of the circle
val coords = Vector3()
val wander = behavior as Wander<Vector2> // defined elsewhere above
coords.set(wander.wanderCenter, 0F)
cam.project(coords) // coords now has wanderCenter in screen coordinates

// now, the part I'm interested in, calculating the radius
val radiusCoords = Vector3(wander.wanderCenter, 0F).add(wander.wanderRadius, 0F, 0F)
cam.project(radiusCoords)
radiusCoords.sub(coords)
val radius = radiusCoords.x // this is the value I want

The first half of the code snippet is fine, and provided for context. But the second half...I'm basically taking a scalar and plugging it through a Vector3 and a series of Complicated Matrix Math to convert it to another larger scalar. Is there an easier way to do what I'm doing? I've looked around a bit -- like at OrthographicCamera's combined.getScaleX() field, but it doesn't seem to have the value I need.

\$\endgroup\$
0
\$\begingroup\$

Turns out this was pretty easy. You know the width of the screen, you know the width (and zoom) of the camera's viewport...just math it up:

fun Float.metersToPixels(cam: OrthographicCamera): Float {
    return this * cam.scale
}
fun Float.pixelsToMeters(cam: OrthographicCamera): Float {
    return this / cam.scale
}
val OrthographicCamera.scale: Float
    get() = Gdx.graphics.width / viewportWidth / zoom
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.