1 Star 0 Fork 0

mmc/threeJs-demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
关键帧动画demo.html 4.93 KB
一键复制 编辑 原始数据 按行查看 历史
mmc 提交于 2022-06-30 10:52 . 提交使用three.js写的一些小案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<script src="./three.js/three.js"></script>
<script src="./three.js/OrbitControls.js"></script>
<script src="./three.js/stats.js"></script>
<script src="./three.js/dat.gui.js"></script>
<script>
var scene = new THREE.Scene();
var ball = new THREE.SphereGeometry(20);
var ballMaterial = new THREE.MeshLambertMaterial({ color: "#0f0" });
var ballMesh = new THREE.Mesh(ball, ballMaterial);
var rectangle = new THREE.BoxGeometry(50, 10, 10);
var rectangleMaterial = new THREE.MeshLambertMaterial({ color: "#00f" });
var rectangleMesh = new THREE.Mesh(rectangle, rectangleMaterial);
var group = new THREE.Group();
scene.add(group);
rectangleMesh.name = "Box"; //网格模型1命名
ballMesh.name = "Sphere"; //网格模型2命名
// group.add(mesh1); //网格模型添加到组中
// group.add(mesh2); //网格模型添加到组中
group.add(ballMesh, rectangleMesh);
/**
* 编辑group子对象网格模型mesh1和mesh2的帧动画数据
*/
// 创建名为Box对象的关键帧数据
var times = [0, 10]; //关键帧时间数组,离散的时间点序列
var values = [0, 0, 0, 300, 0, 0]; //与时间点对应的值组成的数组
// 创建位置关键帧对象:0时刻对应位置0, 0, 0 10时刻对应位置150, 0, 0
var posTrack = new THREE.KeyframeTrack("Box.position", times, values);
// 创建颜色关键帧对象:10时刻对应颜色1, 0, 0 20时刻对应颜色0, 0, 1
var colorKF = new THREE.KeyframeTrack(
"Box.material.color",
[10, 20],
[1, 0, 0, 0, 0, 1]
);
// 创建名为Sphere对象的关键帧数据 从0~20时间段,尺寸scale缩放3倍
var scaleTrack = new THREE.KeyframeTrack(
"Sphere.scale",
[0, 20],
[1, 1, 1, 3, 3, 3]
);
// duration决定了默认的播放时间,一般取所有帧动画的最大时间
// duration偏小,帧动画数据无法播放完,偏大,播放完帧动画会继续空播放
var duration = 20;
// 多个帧动画作为元素创建一个剪辑clip对象,命名"default",持续时间20
var clip = new THREE.AnimationClip("default", duration, [
posTrack,
colorKF,
scaleTrack,
]);
/**
* 播放编辑好的关键帧数据
*/
// group作为混合器的参数,可以播放group中所有子对象的帧动画
var mixer = new THREE.AnimationMixer(group);
// 剪辑clip作为参数,通过混合器clipAction方法返回一个操作对象AnimationAction
var AnimationAction = mixer.clipAction(clip);
//通过操作Action设置播放方式
AnimationAction.timeScale = 20; //默认1,可以调节播放速度
// AnimationAction.loop = THREE.LoopOnce; //不循环播放
AnimationAction.play(); //开始播放
var ambientLight = new THREE.AmbientLight("#fff");
scene.add(ambientLight);
var width = window.innerWidth;
var height = window.innerHeight;
var camera = new THREE.OrthographicCamera(
width / -2,
width / 2,
height / 2,
height / -2,
0.1,
1000
);
camera.position.set(200, 200, 200);
camera.lookAt(scene.position);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
renderer.setClearColor("#333");
document.body.appendChild(renderer.domElement);
var axes = new THREE.AxesHelper(500);
scene.add(axes);
var orbitControls = new THREE.OrbitControls(camera, renderer.domElement);
//创建一个时钟对象
var clock = new THREE.Clock();
function render() {
renderer.render(scene, camera);
// rectangleMesh.rotation.x += 0.01;
requestAnimationFrame(render);
mixer.update(clock.getDelta());
}
render();
window.onresize = function () {
renderer.setSize(window.innerWidth, window.innerHeight);
// 重置相机投影的相关参数
camera.left = window.innerWidth / -2;
camera.right = window.innerWidth / 2;
camera.top = window.innerHeight / 2;
camera.bottom = window.innerHeight / -2;
// 渲染器执行render方法的时候会读取相机对象的投影矩阵属性projectionMatrix
// 但是不会每渲染一帧,就通过相机的属性计算投影矩阵(节约计算资源)
// 如果相机的一些属性发生了变化,需要执行updateProjectionMatrix ()方法更新相机的投影矩阵
camera.updateProjectionMatrix();
};
</script>
</body>
</html>
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mimanchi680/three-js-demo.git
[email protected]:mimanchi680/three-js-demo.git
mimanchi680
three-js-demo
threeJs-demo
master

搜索帮助