2

I'm new at ThreeJS and trying to learn so I have basically create a text which is rendered 3D and I'm using TextGeometry and I need that object's size like width/height to always center the object.

I'm trying like this;

   var objToCenter = scene.getObjectById(textGeoID);
   var hey = objToCenter.geometry.boundingSphere.center.x;
   console.log(hey);

First, I find the object and then assign boundingSphere.center.x value to new variable. But I get "boundingSphere is null" error.

When I try to console.log objectToCenter, object is there and also boundingSphere is NOT null but when I try objectToCenter.boundingSphere it says null. And interestingly when I go console and write these lines it works perfectly.

My full Code: (somehow fontloader not load the font from source url but it works in localhost,so pls try code in localhost or you can't see the text here)

// Scene, Camera, Renderer, GUI
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer( { antialias:true } );
var gui = new dat.GUI({name: 'Control Panel'});

// Renderer and Camera Settings
renderer.setSize( window.innerWidth, window.innerHeight-4 );
renderer.shadowMap.enabled = false;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
document.body.appendChild( renderer.domElement );
camera.position.set( 10, 10, 500 );

// Axiss Helper and Orbit Controls
var axesHelper = new THREE.AxesHelper( 500 );
scene.add( axesHelper );
var controls = new THREE.OrbitControls( camera, renderer.domElement );

// Variables for TextGeometry
var textData = {
    text: "Yunus Emre Uzun",
    size: 40,
    height: 5,
    curveSegments: 12,
    font: "helvetiker",
    weight: "regular",
    bevelEnabled: false,
    bevelThickness: 1,
    bevelSize: 0.5,
    bevelOffset: 0.0,
    bevelSegments: 3
};

var textGeoID = null;
function generateTextGeometry() {
    if (textGeoID!=null) {
        console.log('ID: ' + textGeoID);
        var object = scene.getObjectById(textGeoID);
        //console.log('Object:');
        //console.log(object);
        object.geometry.dispose();
        scene.remove(object);
    }
  
    var loader = new THREE.FontLoader();
    loader.load( 'https://clofro.com/cdn/fonts/helvetiker_regular.typeface.json', function ( font ) {
        var textGeometry = new THREE.TextGeometry( textData.text, {
            font: font,
            size: textData.size,
            height: textData.height,
            curveSegments: textData.curveSegments,
            bevelEnabled: textData.bevelEnabled,
            bevelThickness: textData.bevelThickness,
            bevelSize: textData.bevelSize,
            bevelOffset: textData.bevelOffset,
            bevelSegments: textData.bevelSegments
        } );
      
        var textMaterial = new THREE.MeshBasicMaterial( { color: 0x444444, wireframe: true } );
        var meshedObject = new THREE.Mesh( textGeometry, textMaterial );
        meshedObject.position.set(-212, -15, 20 /* 15 */);
        scene.add(meshedObject);
        textGeoID = meshedObject.id;
      
       
        centerTheText();
    } );
}

function centerTheText() {
    var objToCenter = scene.getObjectById(textGeoID);
    console.log('Object bellow is objToCenter and its id is: ' + objToCenter.id);
    console.log(objToCenter);
    console.log('Error bellow is for: objToCenter.geometry.boundingSphere.center.x');
    var hey = objToCenter.geometry.boundingSphere.center.x;
    console.log(hey);
}

generateTextGeometry();

gui.add(textData, 'text').onChange(generateTextGeometry);
gui.add(textData, 'size', 5, 100).onChange(generateTextGeometry);















// Add Point Light
var pointLight = new THREE.PointLight(0xffffff, 0.3); pointLight.position.set(50, 0, 150);
pointLight.castShadow = true;
pointLight.shadow.mapSize.width = 2048;
pointLight.shadow.mapSize.height = 2048;
scene.add(pointLight);
// Random colors
//pointLight.color.setHSL(Math.random(), 1, 0.5);

// Add Ambiant Light - halogen ambient light
var ambientLight = new THREE.AmbientLight(0xFFF1E0, 0.4);
scene.add(ambientLight);

var width = 450;
var height = 60;
var intensity = 0.8;
var rectLight = new THREE.RectAreaLight( 0xff0000, intensity,  width, height );
rectLight.position.set( 0, 0, 14 );
rectLight.rotation.y = 6.28;
rectLight.lookAt( 0,0,0 );
scene.add( rectLight )
gui.add(rectLight, 'intensity', 0,5);
rectLightHelper = new THREE.RectAreaLightHelper( rectLight );
rectLight.add( rectLightHelper );








// Create BackBox Shape
var backBoxGeo = new THREE.BoxGeometry(500, 75, 10);
// Create BackBox Material, color, texture
var backBoxMat = new THREE.MeshStandardMaterial( { color: 0xdaf1f9, wireframe: false, flatShading: false } );
var backBox = new THREE.Mesh( backBoxGeo, backBoxMat );
backBox.receiveShadow = true;
scene.add(backBox);
backBox.position.set(0, 0, 0);









// Resize Renderer Function
window.addEventListener('resize', function() {
    renderer.setSize( window.innerWidth, window.innerHeight-4 );
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
});

// Update scene
var update = function() {
    controls.update();
};

// Draw scene
var render = function() {
    renderer.render( scene, camera );
};

// Frame loop (update, render, repeat)
var frameLoop = function() {
    requestAnimationFrame( frameLoop );
    update();
    render();
}

frameLoop();
* {
    margin: 0;
    padding: 0;
}
body { background-color: #000; }
<!DOCTYPE html>
<html lang="en" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title>threeJS</title>
    </head>
    <body>
      <script src="https://clofro.com/cdn/three.js"></script>
      <script src="https://clofro.com/cdn/dat.gui.min.js"></script>
      <script src="https://clofro.com/cdn/OrbitControls.js"></script>
    </body>
</html>

My explanations with SS;

Screenshot 1:

Screenshot 2:

Why it could be happening? or can I use something else to center my text. (set position not a fix because 0,0,0 is different for box objects and texts)

2 Answers 2

4

When you create an instance of TextGeometry, the respective bounding sphere is not available yet. However, it is automatically computed by the renderer for view frustum culling.

So if you have to access the bounding sphere of the geometry right after its creation, call objToCenter.geometry.computeBoundingSphere();.

Live Demo: https://jsfiddle.net/zcn2tpqy/

three.js R107

Sign up to request clarification or add additional context in comments.

Comments

0

I know this is too old to answer, but I just want to share my solution here.

First, I just added this code:

geometry.computeBoundingSphere()

Then, access the boundingSphere like so:

geometry.boundingSphere

Overall code

geometry.computeBoundingSphere()

console.log(geometry.boundingSphere.radius)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.