javascript - 三个js中网格的中间挤压

标签 javascript three.js 3d blender

我目前正在创建一个三个 js 应用程序,我只是想问这是否可行。所以我的目标是在 blender 中创建一个模型,类似于下图中的网格#1,通过 KhronosGroup 的 blender gltf 导出器将其导出,将其导入到 Three JS 中并挤出中间的网格以实现下图中的网格#2。

这样做的原因是我需要显示一个可以具有动态长度的模型,并让用户通过应用程序的 UI 控制模型的长度。

这可能吗?如果没有,我有办法实现我需要完成的行为吗?

enter image description here

最佳答案

将模型缩小到单位 bbox,并使用自定义顶点着色器根据模型空间位置来操作顶点。

const vs = `
uniform float uWidthModifier;
void main() 
{
  vec3 p = position;
  if (p.x > 0.33) {
    p.x += 0.5 * uWidthModifier;
  } else if (p.x < -0.33) {
    p.x -= 0.5 * uWidthModifier;
  }
	vec4 modelViewPosition = modelViewMatrix * vec4(p, 1.0);
	gl_Position = projectionMatrix * modelViewPosition;
}
`;

const fs = `
void main() {
	gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;

let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
let renderer = new THREE.WebGLRenderer();
let geometry = new THREE.BoxGeometry(2, 2, 2, 4, 1, 1);
let material = new THREE.ShaderMaterial({
  uniforms: {
    uWidthModifier: { value: 0 }
  },
  fragmentShader: fs,
  vertexShader: vs,
  wireframe: true
});
let cube = new THREE.Mesh(geometry, material);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
scene.add(cube);
camera.position.z = 5;

document.getElementById('inc').addEventListener('click', function() {
  material.uniforms.uWidthModifier.value += 0.5;
});
document.getElementById('dec').addEventListener('click', function() {
  material.uniforms.uWidthModifier.value -= 0.5;
});

function animate() {
	requestAnimationFrame(animate);
  cube.rotation.y += 0.01;
	renderer.render(scene, camera);
}
animate();
#config {
  color: white;
  position: absolute;
  z-index: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/96/three.js"></script>
<div id="config">
  uWidthModifier:
  <button id="inc">+</button>
  <button id="dec">-</button>
</div>

关于javascript - 三个js中网格的中间挤压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52308591/

相关文章:

javascript - "THREE.NearestFilter"或"THREE.LinearFilter"导致黑色平面

javascript - 为什么我的请求对象没有方法 `param` ?

javascript - 如何居中和缩放对象threejs

webgl - THREE.JS阴影在光的另一侧

javascript - Javascript 中的半边数据结构?

algorithm - 将 2D 平面转换为 3D 模型

javascript - 在 three.js 中将向量从全局空间转换为局部向量

javascript - 单击按钮时如何生成一组数组而不消失第一个数组?

javascript - Stripe : no such token

javascript - 使用 AJAX 将地理位置数据发布到 PHP