旋转对象随机矩阵(Three.js)
Rotate object with random matrix (Three.js)
我试图在Three.js中创建一个骰子,它将在点击时随机旋转,但是我在点击时无法获得轴值更新。这就是我目前所做的。
<style type="text/css" media="screen">
html, body, canvas {
margin: 0;
padding: 0;
background: #4e6171;
color: black;
}
canvas {
width: 100%;
height: 100%;
}
</style>
<body onload="animateScene();">
<div id="container"></div>
<script type="text/javascript" src="js/three.min.js"></script>
<script type="text/javascript" src="js/Detector.js"></script>
<script type="text/javascript">
if (!Detector.webgl) Detector.addGetWebGLMessage();
</script>
<script type="text/javascript" src="js/TrackballControls.js"></script>
<script type="text/javascript" src="js/setup.js"></script>
<script type="text/javascript">
function animateScene() {
var objectX = Math.floor(Math.random() * 20);
var objectY = Math.floor(Math.random() * 20);
var objectZ = Math.floor(Math.random() * 20);
var radius = 30;
radius *= 1;
var material = new THREE.MeshBasicMaterial({
color: 0xe2e2e2,
transparent: true,
opacity: 1
});
var geometry = new THREE.IcosahedronGeometry(radius, 0);
var object = new THREE.Mesh(geometry, material);
var edges = new THREE.EdgesHelper(object, 0xffffff);
edges.material.linewidth = 2;
scene.add(object);
scene.add(edges);
scene.add(new THREE.AxisHelper(100));
object.rotation.x = objectX;
object.rotation.y = objectY;
object.rotation.z = objectZ;
controls.enabled = false;
};
</script>
<button class="button" onclick="object.updateMatrix();">Generate</button>
</body>
我希望能够点击对象,并有它动画旋转与新更新的随机轴坐标。目前我得到一个"对象是未定义"的错误。
我无法得到一个小提琴工作,但这里有一个链接。
任何帮助都很感激,谢谢。
我看到这里有两个问题:
- 你的"object"变量是在animateScene()函数的范围内定义的,这就是为什么你会得到"object is undefined"错误。你可以在函数之外定义object(使用"var object"),然后它将在全局作用域中,或者你可以在animateScene函数中附加onClick回调。
- 即使你修复了作用域问题,对象也不会旋转,因为你只在animateScene()中设置了一次旋转。相反,您需要为X, Y和Z生成新的随机值,然后调用object. updatemmatrix()。
希望有帮助!
UPDATE
所以我昨晚有了一个突破,能够得到我正在寻找的东西。我最终在场景中创建了另一个函数,生成新的x和y值,然后更新矩阵。我用tween.js处理动画。此外,我将点击事件绑定在animateScene函数内部,而不是外部的onClick。
非常感谢Tim在这个问题上的指导。
<body onload="animateScene();">
<div id="container"></div>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/three.min.js"></script>
<script type="text/javascript" src="js/tween.min.js"></script>
<script type="text/javascript" src="js/Detector.js"></script>
<script type="text/javascript">
if (!Detector.webgl) Detector.addGetWebGLMessage();
</script>
<script type="text/javascript" src="js/TrackballControls.js"></script>
<script type="text/javascript" src="js/setup.js"></script>
<script type="text/javascript">
var object
function animateScene() {
var radius = 30;
radius *= 1;
var material = new THREE.MeshBasicMaterial({
color: 0xe2e2e2,
transparent: true,
opacity: 1
});
var geometry = new THREE.IcosahedronGeometry(radius, 0);
var object = new THREE.Mesh(geometry, material);
var edges = new THREE.EdgesHelper(object, 0xffffff);
edges.material.linewidth = 2;
scene.add(object);
scene.add(edges);
scene.add(new THREE.AxisHelper(100));
controls.enabled = false;
function rollDice() {
var x = Math.floor(Math.random() * (14 - 7) + 7);
var y = Math.floor(Math.random() * (14 - 7) + 7);
var tween = new TWEEN.Tween(object.rotation)
.to({ x, y }, 500)
.start();
animate();
function animate() {
requestAnimationFrame(animate);
TWEEN.update();
}
}
$( "#click" ).click(rollDice);
}
</script>
<button class="button" id="click">Generate</button>
</body>
相关文章:
- 在Three.js中导出网格会提高性能吗
- 如何在three.js上添加两个向量
- Three.js Points Rotation
- 无法读取属性'材料'未定义的Three.js
- Potree/Three.js测量问题
- Three.JS OBJ模型未显示
- 有没有一种方法可以获得three.js的最小/lite版本
- JS和three.JS,在浏览器中进行参数测试
- 参数列表Three.js之后的未捕获语法错误:缺少)
- 如何在three.js中有效地使用TraingleStripDrawMode
- 通过拖动可以更改三维模型对象在Three.js场景中的位置
- three.js:如何让透明的png精灵投射和接收阴影
- Three.js更改材质
- three.js EffectComposer's渲染目标
- 单击以将相机放置在Three js中的对象附近
- Three.js Three.投影仪已移至
- THREE.js轨道控制不工作
- Three.js,WebGL,渲染六幅图像的全景图
- 如何在three.js中为三角形添加纹理
- Three.js CanvasRenderer,在将图像纹理设置为平面时出现问题