首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >three.js BufferGeometry blob代码更新错误

three.js BufferGeometry blob代码更新错误
EN

Stack Overflow用户
提问于 2022-03-03 01:14:43
回答 1查看 313关注 0票数 2

我目前正在学习三个js,并且我正在跟踪本教程,但是我注意到,对于当前版本的三个js,代码是无效的,您可以看到下面的主要更改。通过这个文档,我更新了代码,以便:

代码语言:javascript
运行
复制
  var k = 1;
     
  const positions = sphere.geometry.attributes.position.array;
  for (var i = 0; i < positions.length - 2; i++) {
    const v = new THREE.Vector3(
      positions[i], 
      positions[i + 1], 
      positions[i + 2]
    ).normalize()
    .multiplyScalar(
      1 + 0.3 * noise.perlin3(
      positions[i] * k + time,
      positions[i + 1] * k,
      positions[i + 2] * k));
      positions[i] = v.x;
      positions[i + 1] = v.y;
      positions[i + 2] = v.z;
  }
  
 sphere.geometry.attributes.position.needsUpdate = true;

但是,正如您可以从片段中看到的,顶点的位移不是平滑的,也不像教程。我在这里错过了什么?

代码语言:javascript
运行
复制
var renderer = new THREE.WebGLRenderer({ canvas : document.getElementById('canvas'), antialias:true});
// default bg canvas color //
renderer.setClearColor(0x7b7b7b);
//  use device aspect ratio //
renderer.setPixelRatio(window.devicePixelRatio);
// set size of canvas within window //
renderer.setSize(window.innerWidth, window.innerHeight);




var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 45, window.innerWidth/window.innerHeight, 0.1, 1000 );
camera.position.z = 5;


var sphere_geometry = new THREE.SphereGeometry(1, 128, 128);
const material = new THREE.MeshPhongMaterial({
    color: 0x0000FF,
    shininess: 1000,
  })

var sphere = new THREE.Mesh(sphere_geometry, material);
scene.add(sphere);
const ambientLight = new THREE.AmbientLight(0x798296)
scene.add(ambientLight)
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
    directionalLight.position.set(5, 10, 7)
scene.add(directionalLight);
sphere.geometry.attributes.position.needsUpdate = true;

var update = function() {

  // change '0.003' for more aggressive animation
  var time = performance.now() * 0.003;
  //console.log(time)

  //go through vertices here and reposition them
  
  // change 'k' value for more spikes
  var k = 1;
     
  const positions = sphere.geometry.attributes.position.array;
  for (var i = 0; i < positions.length - 2; i++) {
    const v = new THREE.Vector3(
      positions[i], 
      positions[i + 1], 
      positions[i + 2]
    ).normalize()
    .multiplyScalar(
      1 + 0.3 * noise.perlin3(positions[i] * k + time,                 positions[i + 1] * k,
      positions[i + 2] * k));
      positions[i] = v.x;
      positions[i + 1] = v.y;
      positions[i + 2] = v.z;
  }
  
 sphere.geometry.attributes.position.needsUpdate = true;
}

function animate() {
  sphere.rotation.x += 0.01;
  sphere.rotation.y += 0.01;

  update();
  /* render scene and camera */
  renderer.render(scene,camera);
  requestAnimationFrame(animate);
}


requestAnimationFrame(animate);
代码语言:javascript
运行
复制
html, body {
  margin:0;
  overflow:hidden
}
代码语言:javascript
运行
复制
<script src="https://fariskassim.com/stage/rebel9/teaf/blob/v4/js/perlin.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<canvas id="canvas"></canvas>

EN

回答 1

Stack Overflow用户

发布于 2022-03-03 06:46:19

这就是如何使用BufferGeometry使一个带噪声的球体变形。

代码语言:javascript
运行
复制
var renderer = new THREE.WebGLRenderer({ canvas : document.getElementById('canvas'), antialias:true});
// default bg canvas color //
renderer.setClearColor(0x7b7b7b);
//  use device aspect ratio //
renderer.setPixelRatio(window.devicePixelRatio);
// set size of canvas within window //
renderer.setSize(window.innerWidth, window.innerHeight);




var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 45, window.innerWidth/window.innerHeight, 0.1, 1000 );
camera.position.z = 5;


var sphere_geometry = new THREE.SphereGeometry(1, 128, 128);
const material = new THREE.MeshPhongMaterial({
    color: 0x0000FF,
    shininess: 1000,
  })

var sphere = new THREE.Mesh(sphere_geometry, material);
scene.add(sphere);
const ambientLight = new THREE.AmbientLight(0x798296)
scene.add(ambientLight)
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
    directionalLight.position.set(5, 10, 7)
scene.add(directionalLight);
sphere.geometry.attributes.position.needsUpdate = true;

var update = function() {

  // change '0.003' for more aggressive animation
  var time = performance.now() * 0.003;
  //console.log(time)

  //go through vertices here and reposition them
  
  // change 'k' value for more spikes
  var k = 1;
  var v3 = new THREE.Vector3();   
  const positions = sphere.geometry.attributes.position;
  for (var i = 0; i < positions.count; i++) {
    v3.fromBufferAttribute(positions, i).setLength(k);
    let n = noise.perlin3(v3.x, v3.y, v3.z);
    v3.setLength(1 + 0.3 * n);
    positions.setXYZ(i, v3.x, v3.y, v3.z);
  }
  positions.needsUpdate = true;
  sphere.geometry.computeVertexNormals(); // don't forget to call this
}

function animate() {
  sphere.rotation.x += 0.01;
  sphere.rotation.y += 0.01;

  update();
  /* render scene and camera */
  renderer.render(scene,camera);
  requestAnimationFrame(animate);
}


requestAnimationFrame(animate);
代码语言:javascript
运行
复制
html, body {
  margin:0;
  overflow:hidden
}
代码语言:javascript
运行
复制
<script src="https://fariskassim.com/stage/rebel9/teaf/blob/v4/js/perlin.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<canvas id="canvas"></canvas>

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71331022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档