Three.js 在threejs中使用顶点着色器旋转几何体

Three.js 在threejs中使用顶点着色器旋转几何体,three.js,rotation,glsl,vertex-shader,Three.js,Rotation,Glsl,Vertex Shader,我正在尝试使用顶点着色器旋转一个长方体,但是它被剪切了,原因我不明白,下面是代码,请帮助我。这是小提琴和我的顶点着色器代码 均匀浮点增量; void main() { vec4模型视图位置=模型视图矩阵*vec4(位置,1.0); gl_位置=(projectionMatrix*modelViewPosition); 浮动新位置x=gl位置x*cos(delta)-gl位置y*sin(delta); 浮动新位置y=gl_位置.y*cos(delta)+gl_位置.x*sin(delta); gl

我正在尝试使用顶点着色器旋转一个长方体,但是它被剪切了,原因我不明白,下面是代码,请帮助我。这是小提琴和我的顶点着色器代码

均匀浮点增量;
void main()
{
vec4模型视图位置=模型视图矩阵*vec4(位置,1.0);
gl_位置=(projectionMatrix*modelViewPosition);
浮动新位置x=gl位置x*cos(delta)-gl位置y*sin(delta);
浮动新位置y=gl_位置.y*cos(delta)+gl_位置.x*sin(delta);
gl_Position.x=新的_x;
gl_Position.y=新位置;
}

如果视口为矩形,则由投影矩阵进行补偿。 这意味着必须应用于顶点坐标的最后一个变换是投影矩阵:

剪辑位置=投影*视图*模型*位置
必须将旋转应用于顶点坐标
位置
。然后通过视图矩阵和投影矩阵变换结果:

均匀浮点增量;
void main()
{
vec3 p=位置xyz;
新浮点数x=p.x*cos(delta)-p.y*sin(delta);
新浮点数y=p.y*cos(δ)+p.x*sin(δ);
gl U Position=projectionMatrix*modelViewMatrix*vec4(新_ux,new_UY,p.z,1.0);
}
此外,设置为投影矩阵()的纵横比必须与视口的纵横比相匹配(
canvas
):

或者

//渲染器
renderer=new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth、window.innerHeight);
//摄像机
摄像头=新的三个透视摄像头(75,window.innerWidth/window.innerHeight,0.0110000);

//渲染器
renderer=new THREE.WebGLRenderer();
设置大小(画布宽度、画布高度);
//摄像机
摄像机=新的三个透视摄像机(75,画布宽度/画布高度,0.0110000);
请参见示例:

var渲染器,
场景
摄像机,
container=document.getElementById('Canvas_3');
//渲染器
renderer=new THREE.WebGLRenderer();
//renderer.setClearColor(0xffffff);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth、window.innerHeight);
container.appendChild(renderer.domeElement);
//摄像机
摄像头=新的三个透视摄像头(75,window.innerWidth/window.innerHeight,0.0110000);
//场面
场景=新的三个。场景();
var={
三角洲:{
数值:0
}
};
var material=新的3.ShaderMaterial({
制服:海关制服,
vertexShader:document.getElementById('vertexShader').textContent,
fragmentShader:document.getElementById('fragmentShader').textContent
});
var geometry=新的三个.BoxBufferGeometry(1,1,1,0,0);
var mesh=新的三个网格(几何体、材质);
网格位置z=-5;
网格位置x=0;
场景。添加(网格);
window.onresize=函数(){
renderer.setSize(window.innerWidth、window.innerHeight);
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectMatrix();
}
//渲染循环
render();
var-delta=0;
函数render(){
δ+=0.006;
如果(δ>1.57)δ=0;
mesh.material.uniforms.delta.value=delta;
渲染器。渲染(场景、摄影机);
请求动画帧(渲染);
}

均匀浮动三角洲;
void main()
{
vec3 p=位置xyz;
新浮点数x=p.x*cos(delta)-p.y*sin(delta);
新浮点数y=p.y*cos(δ)+p.x*sin(δ);
gl_Position=projectionMatrix*modelViewMatrix*vec4(new_x,new_y,p.z,1.0);
}
均匀浮动三角洲;
void main(){
gl_FragColor=vec4(δ,0.0,1.0-δ,1.0);
}

非常感谢:)