- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 ThreeJS 的新手,正在努力学习,所以我基本上创建了一个呈现 3D 的文本,我正在使用 TextGeometry,我需要该对象的大小(如宽度/高度)以始终将对象居中。
我正在尝试这样;
var objToCenter = scene.getObjectById(textGeoID);
var hey = objToCenter.geometry.boundingSphere.center.x;
console.log(hey);
首先,我找到对象,然后将 boundingSphere.center.x 值分配给新变量。但是我收到“boundingSphere is null”错误。
当我尝试 console.log objectToCenter 时,对象在那里并且 boundingSphere 不是 null 但是当我尝试 objectToCenter.boundingSphere 它说空。有趣的是,当我进入控制台并编写这些行时,它工作得很好。
我的完整代码:(不知何故 fontloader 无法从源 url 加载字体,但它在 localhost 中工作,所以请在 localhost 中尝试代码,否则你看不到这里的文本)
// 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>
我和SS的解释;
截图一:
截图2:
为什么会发生?或者我可以使用其他东西来居中我的文本。(设置位置不是固定的,因为 0,0,0 对于框对象和文本是不同的)
最佳答案
当您创建 TextGeometry
的实例时,相应的边界球体尚不可用。但是,它由渲染器自动计算以进行视锥体剔除。
因此,如果您必须在几何体创建后立即访问其边界球体,请调用 objToCenter.geometry.computeBoundingSphere();
。
现场演示:https://jsfiddle.net/zcn2tpqy/
three.js R107
关于javascript - boundingSphere 为 null - TextGeometry,ThreeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57548030/
我正在研究 ThreeJS geometry canvas text .单击 html 按钮后,文本应该更改为另一个文本。但是,它不起作用。如何更改 TextGeometry on click 事件?
我已经使用 THREE.TextGeometry 在我的场景中添加了一些文本,并且文本似乎卡在我放置它的任何 xy 平面中。有什么方法可以让它始终与用户可读的屏幕保持一致? 最佳答案 尝试 mesh.
我正在尝试在文本几何的帮助下创建一个时钟。为了更新时间,我需要更新文本几何中的文本,这可以通过删除并重新创建新的文本几何来完成。 每次我添加新的文本几何图形时,它都会卡住我的浏览器: // Remo
我正在尝试将光线转换到 TextGeometry 的边界框。当前,当单击不在字母周围或字母之间的字母时,光线转换适用于 textGeometry。如果单击在文本字母/字母表之间,则没有对象与 inte
我最近开始研究 three.js,现在我面临着 textgeometry 的问题。我使用的是 three.js 75 版,我使用的是 js/helvetiker_bold.typeface.js 字体
我正在尝试使用 Three.js 示例提供的已加载 typeface.js 字体,但我不断收到以下错误: Uncaught TypeError: this.addShapeList is not a
我从 TextGeometry 创建了新的 Mesh 并将其插入网格数组: var text3d = new THREE.TextGeometry( "Hello!", { font: "he
我正在使用 Three.js 开发尺寸标注工具。我想在两个对象之间的一条线上写出距离的尺寸。我想写 2.455 如图所示。 遗憾的是,Threejs R88 中的 HTML 编码无法获取,例如 Tex
我按照演示代码操作,但无法绘制 TextGeometry。字体文件存在于服务器上。 var loader = new THREE.FontLoader(); loader.load(
我在 Three.js r74 中的 TextGeometry 有一些问题。 我如何正确实现它? 这是我的 Codepen: codepen.io/cheesyeyes/pen/eJqZxK 提前致谢
如何在 Three.js 中添加文本?我已经尝试过这段代码,但它产生了错误 Uncaught TypeError: Cannot read property 'offsetX' of undefine
我是 ThreeJS 的新手,正在努力学习,所以我基本上创建了一个呈现 3D 的文本,我正在使用 TextGeometry,我需要该对象的大小(如宽度/高度)以始终将对象居中。 我正在尝试这样;
不知道为什么下面的代码(基本上是示例中的剪切和粘贴)返回错误。 var textWhy = new THREE.TextGeometry( "Why", { size: 10, height: 5,
我需要在我的 threejs 项目中渲染一些文本,但是每次我添加模块时 import { FontLoader } from 'https://threejs.org/examples/jsm/loa
我需要在我的 threejs 项目中渲染一些文本,但是每次我添加模块时 import { FontLoader } from 'https://threejs.org/examples/jsm/loa
我已经做了好几个小时的谷歌搜索,看看是否可以做到在 three.js 环境中。 我想创建一个基于 TextGeometry 的发光效果,而不是像下面 Lee StemKoski 中类似的球体或立方体对
我正在尝试使用 three.js TextGeometry 为 unicode 文本制作动画。 文字是:“Saint-Étienne-du-Mont”它在 Canvas 中显示为“Saint-??ti
我正在使用 WebGL、three.js 和 THREE.TextGeometry 制作一些 3D 文本。到目前为止一切正常。我能够创建单行 3D 文本。 现在我想创建多行文本,比如一个短段落。最好,
我是一名优秀的程序员,十分优秀!