我这样向场景中添加一个飞机:
基本的操作。我正在尝试找出如何在Z轴上移动平面以填充浏览器视口。为此,
这实际上是将平面放大以填充视口,但是在Y轴上而不是X轴上。 我想了解为什么我的数学是参考Y轴的,以及如何进行转换,使平面填充视口宽度而不是高度?
编辑:
我想实现类似于这个https://tympanus.net/Tutorials/GridToFullscreenAnimations/index4.html的效果。但是在给定的示例中,他们只是缩放x和y像素以填充屏幕,因此没有实际的3D - 因此也没有发生任何光照。
我想实际上使用不同的z值将平面向相机移动,以便我可以计算表面法线,然后再通过片段着色器计算光照,方法是根据法线与光方向的对齐程度来计算,就像在射线追踪中所做的那样。
// Camera
this.three.camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 60);
// Plane
const planeGeometry = new THREE.PlaneBufferGeometry(1,1,this.options.planeSegments,this.options.planeSegments);
const planeMat = new THREE.ShaderMaterial( ... )
this.three.plane = new THREE.Mesh(planeGeometry,planeMat);
this.three.scene.add(this.three.plane);
基本的操作。我正在尝试找出如何在Z轴上移动平面以填充浏览器视口。为此,
// See attachment "solving for this" is closeZ
const closeZ = 0.5 / Math.tan((this.three.camera.fov/2.0) * Math.PI / 180.0);
this.uniforms.uZMax = new THREE.Uniform(this.three.camera.position.z - closeZ);
现在我知道在我的着色器中,我可以添加多少Z值来使平面填满视口。顶点着色器如下:
uniform float uZMax;
void main() {
vec3 pos = (position.xy, uZMax);
gl_Position = projectionMatrix * modelViewMatrix * vec4( pos, 1 );
}
这实际上是将平面放大以填充视口,但是在Y轴上而不是X轴上。 我想了解为什么我的数学是参考Y轴的,以及如何进行转换,使平面填充视口宽度而不是高度?
编辑:
我想实现类似于这个https://tympanus.net/Tutorials/GridToFullscreenAnimations/index4.html的效果。但是在给定的示例中,他们只是缩放x和y像素以填充屏幕,因此没有实际的3D - 因此也没有发生任何光照。
我想实际上使用不同的z值将平面向相机移动,以便我可以计算表面法线,然后再通过片段着色器计算光照,方法是根据法线与光方向的对齐程度来计算,就像在射线追踪中所做的那样。
this.uniforms.uZMax = ...
, seems it has to bethis.uniforms.uZMax.value = ...
- prisoner849new THREE.Uniform
构造函数,那是正确的。但是 Three Uniform 类会负责添加具有正确参数的对象。 - marks