将球体变形为平面
Morphing Sphere into Plane
有办法将SphereGeometry()
对象更改为屏幕上的平面吗?我想完全像这个网站一样做,所以当你点击右下角的按钮时,视图就会改变。下面的代码是如何创建球体的。简洁很重要。
var loader = new THREE.TextureLoader();
loader.load("js/model/map.jpg", function(texture) {
var earthMaterial = new THREE.MeshBasicMaterial({
map: texture,
bumpscale: 0.05
});
var earthSphereGeometry = new THREE.SphereGeometry(80, 32, 32);
earthSphere = new THREE.Mesh(earthSphereGeometry, earthMaterial);
scene.add(earthSphere);
})
说到将类地球球体变形为类地图平面-几何体变形(顶点位移)效果很好。从三开始。SphereBufferGeometry不会很好地工作,因为展开的多边形球体不完全是一个平面。
但THREE不存在这样的问题。PlaneBufferGeometry。要构建所需的对象,可以使用自己的ShaderMaterial。这样的材质应该在顶点着色器中计算类似目标球体的变形(要么在CPU上,然后它应该作为另一个属性传递)。使用浮动均匀使两种状态平滑地混合在一起。
下面是一个使用three.js的77修订版进行这种包装的工作示例(使用滑块进行包装)。
vec3 anglesToSphereCoord(vec2 a, float r)
{
return vec3(
r * sin(a.y) * sin(a.x),
r * cos(a.y),
r * sin(a.y) * cos(a.x)
);
}
void main() {
vec2 angles = M_PI * vec2(2. * uv.x, uv.y - 1.);
vec3 sphPos = anglesToSphereCoord(angles, 0.6);
vec3 wrapPos = mix(position, sphPos, wrapAmountUniform);
gl_Position = projectionMatrix * modelViewMatrix * vec4( wrapPos, 1.0 );
}
值得注意的是,这种物体结构对相机位置很敏感。为了隐藏剪切并在任何角度都有一个很好的过渡,你可以固定相机并在着色器中应用旋转(不是旋转几何体,而是旋转uv坐标)。处理不同的投影也是如此。
相关文章:
- 为什么在变形之前不缺少Fx
- 设置动画时,SVG/Raphael大圆圈会变形
- ThreeJS将画布中的文本渲染为纹理,然后应用于平面
- 嵌套JSON到平面HTML表
- 纸张.js中的线条变形
- SVG使用Javascript将形状平滑地变形为其他预定义的形状
- Three.js CanvasRenderer,在将图像纹理设置为平面时出现问题
- 使用方程和/或矢量在三维空间中绘制二维平面
- jQuery-变形按钮概念-问题
- jQuery变形按钮概念-fadeIn()并不总是有效
- jQuery变形按钮概念
- array_push平面数组问题-需要能够向数组中添加多个变量
- 使用THRE.Frustum计算近/远平面顶点
- 变形后镀铬中的蓝光图像
- D3:使用 nest 函数将带有父键的平面数据转换为层次结构
- 视觉变形 |SVG vs 画布 vs 其他
- 坐标符号变形
- Three.js:如何创建新的'变形'如果我有所有必要的缓冲区
- 通过键将平面对象转换为嵌套结构
- 将球体变形为平面