threejs 12 animation动画

Posted Jessica巨人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了threejs 12 animation动画相关的知识,希望对你有一定的参考价值。

import * as THREE from "three"
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
import { AnimationActionLoopStyles, AnimationClip, AnimationMixer, BoxBufferGeometry, Clock, DirectionalLight, HemisphereLight, KeyframeTrack, SphereBufferGeometry, VectorKeyframeTrack } from "three";


var renderer = new THREE.WebGLRenderer({ antialias: true });
// renderer.domElement;//是一个canvas 可以从参数传入
document.body.appendChild(renderer.domElement);

renderer.setSize(window.innerWidth, window.innerHeight);//设置画布高宽
renderer.setClearColor(0xffffff);//设置背景清空颜色

window.addEventListener("resize", () => {//窗口大小变化事件
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = window.innerWidth / window.innerHeight;
    //设置了aspect  必须更新相机的投影矩阵
    camera.updateProjectionMatrix();
})

var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 50)
var control = new OrbitControls(camera, renderer.domElement);
var scene = new THREE.Scene();
// var light = new DirectionalLight();
var light = new HemisphereLight(0xffffff, 0x444444);
scene.add(light);

scene.add(new THREE.AxesHelper(10000));

var cubeGeometry = new BoxBufferGeometry(5, 6, 7);
var material = new THREE.MeshPhongMaterial();
var cubeMesh = new THREE.Mesh(cubeGeometry, material)
scene.add(cubeMesh);

//---------------------------------------------------------------------------------------------------------------
/**
 * threejs里面实现一个动画
 * 1.Animation Clips   动画片段 一个动画可以表示一个动作
 * 2.Keyframe Tracks 关键帧(轨迹)序列  就是关键帧的集合
 * 关键帧 在相应的帧设置相应帧  两个关键帧之间的动作建模软件可以自动插值
 * 3 Animation Mixer动画合成器  可以把同一时间点的多个动作进行混合
 * 
 * THREE提供以下的关键帧 ,他们都继承自KeyframeTrack
 * name 关键帧的名字  可以使绑定我要做模型动画主题模型的属性
 * times 关键序列的时间
 * values 不同时间片段的值
 * interpolation 两个帧之间的插值方式
 * KeyframeTrack(name: string, times: ArrayLike<any>, values: ArrayLike<any>, interpolation?: InterpolationModes)
 * 
 * BooleanKeyframeTrack
ColorKeyframeTrack
NumberKeyframeTrack
QuaternionKeyframeTrack
StringKeyframeTrack  到某个时间点的时候变成了另外一个值
VectorKeyframeTrack
 */

var positionKF = new THREE.VectorKeyframeTrack('.position', [0, 1], [0, 0, 0, 30, 0, 0,]);

/**
 * name?: string, 片段的名字
 *  duration?: number,  片段的时长
 * tracks?: THREE.KeyframeTrack[] 使我们关键帧序列的合集
 */
var animationClip = new AnimationClip("default", 2, [positionKF])

var animationMixer = new AnimationMixer(cubeMesh);
/**
 * 使用AnimationClip生产AnimationAction
 */
var aniAction = animationMixer.clipAction(animationClip)
aniAction.play();

aniAction.setLoop(THREE.LoopPingPong)
var clock = new Clock();

update()

function update() {
    console.log('刷新')
    var delta = clock.getDelta();
    animationMixer.update(delta);
    renderer.render(scene, camera);
    requestAnimationFrame(update);//不会卡塞,专门针对图形渲染刷新的方法
}

位置、大小、形状动画变化

import * as THREE from "three"
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
import { AnimationActionLoopStyles, AnimationClip, AnimationMixer, BoxBufferGeometry, Clock, DirectionalLight, HemisphereLight, KeyframeTrack, SphereBufferGeometry, VectorKeyframeTrack } from "three";


var renderer = new THREE.WebGLRenderer({ antialias: true });
// renderer.domElement;//是一个canvas 可以从参数传入
document.body.appendChild(renderer.domElement);

renderer.setSize(window.innerWidth, window.innerHeight);//设置画布高宽
renderer.setClearColor(0xffffff);//设置背景清空颜色

window.addEventListener("resize", () => {//窗口大小变化事件
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = window.innerWidth / window.innerHeight;
    //设置了aspect  必须更新相机的投影矩阵
    camera.updateProjectionMatrix();
})

var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 50)
var control = new OrbitControls(camera, renderer.domElement);
var scene = new THREE.Scene();
// var light = new DirectionalLight();
var light = new HemisphereLight(0xffffff, 0x444444);
scene.add(light);

scene.add(new THREE.AxesHelper(10000));

var cubeGeometry = new BoxBufferGeometry(5, 6, 7);
var material = new THREE.MeshPhongMaterial();
var cubeMesh = new THREE.Mesh(cubeGeometry, material)
scene.add(cubeMesh);


/**
 * threejs里面实现一个动画
 * 1.Animation Clips   动画片段 一个动画可以表示一个动作
 * 2.Keyframe Tracks 关键帧(轨迹)序列  就是关键帧的集合
 * 关键帧 在相应的帧设置相应帧  两个关键帧之间的动作建模软件可以自动插值
 * 3 Animation Mixer动画合成器  可以把同一时间点的多个动作进行混合
 * 
 * THREE提供以下的关键帧 ,他们都继承自KeyframeTrack
 * name 关键帧的名字  可以使绑定我要做模型动画主题模型的属性
 * times 关键序列的时间
 * values 不同时间片段的值
 * interpolation 两个帧之间的插值方式
 * KeyframeTrack(name: string, times: ArrayLike<any>, values: ArrayLike<any>, interpolation?: InterpolationModes)
 * 
 * BooleanKeyframeTrack
ColorKeyframeTrack
NumberKeyframeTrack
QuaternionKeyframeTrack
StringKeyframeTrack  到某个时间点的时候变成了另外一个值
VectorKeyframeTrack
 */

var positionKF = new THREE.VectorKeyframeTrack('.position', [0, 1], [0, 0, 0, 30, 0, 0,]);
var scaleKF = new THREE.VectorKeyframeTrack('.scale', [0, 1], [1, 1, 1, 10, 1, 1,]);
var colorKF = new THREE.ColorKeyframeTrack('.material.color4 ', [0, 1], [1, 1, 1, 0, 0.5, 1,]);
var visibleKF = new THREE.BooleanKeyframeTrack('.visible', [0, 1, 2], [true, false, false]);
var stringKF = new THREE.BooleanKeyframeTrack('.name', [0, 1, 2], ["白天", "晚上", "晚上"]);

/**
 * name?: string, 片段的名字
 *  duration?: number,  片段的时长
 * tracks?: THREE.KeyframeTrack[] 使我们关键帧序列的合集
 */
var animationClip = new AnimationClip("default", 2, [positionKF, scaleKF, colorKF, visibleKF])

var animationMixer = new AnimationMixer(cubeMesh);
/**
 * 使用AnimationClip生产AnimationAction
 */
var aniAction = animationMixer.clipAction(animationClip)
aniAction.play();
/**
 * export enum AnimationActionLoopStyles {}
export const LoopOnce: AnimationActionLoopStyles;  只播放一次
export const LoopRepeat: AnimationActionLoopStyles; 重复播放
export const LoopPingPong: AnimationActionLoopStyles; 来回播放
 */
aniAction.setLoop(THREE.LoopPingPong)
var clock = new Clock();

update()

function update() {
    console.log('刷新')
    var delta = clock.getDelta();
    animationMixer.update(delta);
    renderer.render(scene, camera);
    requestAnimationFrame(update);//不会卡塞,专门针对图形渲染刷新的方法
}

以上是关于threejs 12 animation动画的主要内容,如果未能解决你的问题,请参考以下文章

如何将动画从 Maya 导出到 three.js 工作流

鼠标点击时对象的动画(旋转、移动)

Threejs基础代码段Tweenjs补间动画

怎么自定义android 下拉刷新动画

Android 知识要点整理(12)----Animation(动画)

ViewExpandAnimation