Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 如何在3JS中旋转路径_Three.js - Fatal编程技术网

Three.js 如何在3JS中旋转路径

Three.js 如何在3JS中旋转路径,three.js,Three.js,我不熟悉three.js,我想让一个对象沿着椭圆曲线移动,但在我用椭圆.rotation.y旋转椭圆后,该对象将不再沿着路径移动,该对象仍将沿着原始路径移动,因此如何解决此问题? 我用这个网站上的代码来模拟我的问题 //全局-在渲染循环外部分配这些-已更改 变量立方体=[],标记,样条线; var矩阵=新的三个.Matrix4(); var up=新的三个向量3(0,1,0); var axis=new-THREE.Vector3(); 变量pt、弧度、轴、切线、路径; //getPoint

我不熟悉three.js,我想让一个对象沿着椭圆曲线移动,但在我用
椭圆.rotation.y
旋转椭圆后,该对象将不再沿着路径移动,该对象仍将沿着原始路径移动,因此如何解决此问题? 我用这个网站上的代码来模拟我的问题

//全局-在渲染循环外部分配这些-已更改
变量立方体=[],标记,样条线;
var矩阵=新的三个.Matrix4();
var up=新的三个向量3(0,1,0);
var axis=new-THREE.Vector3();
变量pt、弧度、轴、切线、路径;
//getPoint起始变量-!重要-你明白我;)
var t=0;
//此函数用于生成立方体并为其选择随机颜色
//在初始负载上。
函数getCube(){
//立方体垫和立方体
var-mats=[];
对于(变量i=0;i<6;i++){
push(新的3.MeshBasicMaterial({color:Math.random()*0xffffff}));
}
var cube=新的三个网格(
新三.容积法(2,2,2),
新三种网面材料(垫)
);
返回立方体
}
//Ellipse类,它扩展了虚拟基类曲线
函数椭圆(X半径,yRadius){
三.曲线.调用(此);
//添加半径作为属性
这个.xRadius=xRadius;
this.yRadius=yRadius;
}
Ellipse.prototype=Object.create(三曲线原型);
椭圆.prototype.constructor=椭圆;
//为子类定义getPoint函数
Ellipse.prototype.getPoint=函数(t){
var弧度=2*Math.PI*t;
返回新的3.Vector3(this.xRadius*Math.cos(弧度),
这个.yRadius*数学.sin(弧度),
0 );
};
//
var网格、渲染器、场景、摄影机、控件;
函数init(){
//渲染器
renderer=new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
//场面
场景=新的三个。场景();
//摄像机
摄像头=新的三个透视摄像头(45,window.innerWidth/window.innerHeight,11000);
摄像机位置设置(20,20,20);
//控制
控件=新的三个.轨道控件(摄影机、渲染器.doElement);
controls.addEventListener('change',render);//如果没有动画循环,请使用
控件。minDistance=10;
控件。最大距离=50;
//轻的
var灯=新的三点灯(0xffffff,0.7);
相机。添加(灯光);
scene.add(camera);//仅因为摄影机有子对象而添加到场景
//斧头
添加(新的3.AxisHelper(20));
////////////////////////////////////////
//创建多维数据集//
////////////////////////////////////////
marker=getCube();
标记位置集(0,0,0);
场景。添加(标记);
////////////////////////////////////////
//创建拉伸形状//
////////////////////////////////////////
//路径
路径=新的椭圆(5,10);
//params
var pathSegments=64;
变压管半径=0.5;
var半径分段=16;
var闭合=真;
var geometry=新的三个.TubeBufferGeometry(路径、路径段、管半径、半径段、闭合);
//材料
var材料=新的三种材料。网状材料({
颜色:0x0080ff,
} );
//网孔
网格=新的三个网格(几何体、材质);
场景。添加(网格);
//////////////////////////////////////////////////////////////////////////
//创建基于上述形状的路径//
//////////////////////////////////////////////////////////////////////////
//请注意,这个红色椭圆只是创建了一个指南,以便我可以确定正方形是真实的切线和定位。
//Ellipse类,它扩展了虚拟基类曲线
var曲线=新的三个椭圆曲线(
0,0,//ax,aY
6,11,//X半径,伊拉迪乌斯
0,2*Math.PI,//aStartAngle,aendagle
false,//a按时针方向
0/旋转
);
//定义路径将具有的点的数量
var path2=新的三点路径(curve.getPoints(100));
geometrycirc=path2.createPointsGeometry(100);
var materialcirc=新的三线基本材料({
颜色:0xff0000
} );
//创建要添加到场景中的最终对象
var ellipse=新的三线(geometrycirc、materialcirc);
椭圆位置集(0,0,0);
添加(椭圆);
}
函数animate(){
请求动画帧(动画);
render();
}
函数render(){
//设置标记位置
pt=路径获取点(t);
//设置标记位置
标记器位置设置(点x、点y、点z);
//得到曲线的切线
tangent=path.getTangent(t).normalize();
//计算要绕其旋转的轴
交叉向量(向上,相切).normalize();
//计算上方向向量和切线之间的角度
弧度=Math.acos(向上点(切线));
//设置四元数
marker.quaternion.setFromAxisAngle(轴,弧度);
t=(t>=1)?0:t+=0.002;
渲染器。渲染(场景、摄影机);
}
init();
制作动画()

实现所需的最简单方法不是将管(
网格
)和路径跟踪对象(
标记
)添加到场景中,而是将其添加到
椭圆

因此,
标记
网格
椭圆
的子对象,应用于
椭圆
的变换“继承”到
标记
网格

scene.add(标记器)
scene.add(网格)

椭圆。添加(网格);
椭圆。添加(标记);
场景。添加(elli)