【发布时间】:2019-11-29 20:35:21
【问题描述】:
在我们开始之前,您可能想阅读我之前的帖子,该帖子导致了这个问题的产生:
Drawing/Rendering 3D objects with epicycles and fourier transformations [Animation]
上下文:
使用 P5.js 库并遵循 The Coding Train (Coding Challenge #130.1 --> #130.3) 的教程,我能够使用本轮和傅立叶变换为任何参数绘图设置动画并重新创建。 (阅读上一篇文章,相信我,它会有所帮助)
我现在希望将其扩展到三个维度!
一位乐于助人的社区成员建议将 3D 绘图分成两个平面。这样,我不必编写新代码,并且可以使用我预先存在的 2D 代码!酷吧!
另一位用户建议使用 Three.JS 库为此过程创建 3D 场景。
到目前为止,我已经创建了 3 架飞机。我想基本上将这些飞机用作电视屏幕。然后我可以在电视屏幕上显示我用 P5js 编写的 2D 版本,并在 3D 空间中投影一个新点以生成/绘制新的 3D 绘图。
<html>
<head>
<title>Epicyclic Circles</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<script src="https://rawgit.com/mrdoob/three.js/dev/build/three.js"></script>
<script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/controls/OrbitControls.js"></script>
<script>
// Set up the basic scene, camera, and lights.
var scene = new THREE.Scene();
scene.background = new THREE.Color( 0xf0f0f0 );
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
scene.add(camera)
var light = new THREE.PointLight( 0xffffff, 0.8 );
camera.add( light );
camera.position.z = 50;
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
// Add the orbit controls to permit viewing the scene from different angles via the mouse.
controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.enableDamping = true; // an animation loop is required when either damping or auto-rotation are enabled
controls.dampingFactor = 0.25;
controls.screenSpacePanning = false;
controls.minDistance = 0;
controls.maxDistance = 500;
// Create center and epicyclic circles, extruding them to give them some depth.
var plane = new THREE.Plane( new THREE.Vector3( 1, 0, 0 ), 0 );
var helper = new THREE.PlaneHelper( plane, 50, 0x696969 );
scene.add( helper );
var plane2 = new THREE.Plane( new THREE.Vector3( 0, 1, 0 ), 0 );
var helper2 = new THREE.PlaneHelper( plane2, 50, 0xE06666 );
scene.add( helper2 );
var plane3 = new THREE.Plane( new THREE.Vector3( 0, 0, 1 ), 0 );
var helper3 = new THREE.PlaneHelper( plane3, 50, 0xD85C6 );
scene.add( helper3 );
var size = 10;
var divisions = 10;
var gridHelper = new THREE.GridHelper( size, divisions );
scene.add( gridHelper );
var animate = function () {
requestAnimationFrame( animate );
// During each animation frame, let's rotate the objects on their center axis,
// and also set the position of the epicyclic circle.
renderer.render( scene, camera );
};
animate();
</script>
</body>
</html>
也欢迎任何其他建议/方法! :D
回顾:
- 如何在 ThreeJs 屏幕中显示 P5js 动画
- 如何让它们使用相同的坐标系(p5 使用 X 和 Y 像素)
【问题讨论】:
-
您的流程需要执行的一项任务是在进入
animate循环之前创建场景中所需的所有形状/网格。根据您的 P5 代码,您似乎已经计算了幅度和相位。您可以使用振幅来创建圆形/网格,方法与上一篇文章相同(即new THREE.Shape, THREE.extrudeGeometry, and THREE.mesh)。在位置 0,0,0 创建所有这些,并从 X,Y 平面开始以保持简单。然后,在animate循环中,您将根据时间增量设置所有圈子的位置。 -
即,您不必像重新使用 P5 计算以应用于 three.js 框架那样集成 P5。另外,请注意,当您开始在其他平面上工作时,您创建的圆形/网格最初需要旋转 90 度以符合 X-Z 和 Y-Z 平面。 (例如,在上一个问题中,将
mesh1.rotateX(Math.PI / 2)添加到animate循环之前的代码中,您将看到中心圆旋转到Y-Z 平面。) -
好的,一旦我这样做了。如何添加从中间不同圆圈相交的线以生成一个点。我怎样才能追踪这个点以最终绘制这个形状?我一直在搞乱threeJS,并慢慢掌握了它的窍门:) 谢谢
标签: javascript html animation three.js p5.js