javascript - THREE.js 中的几何 Material

标签 javascript three.js

我正在 THREE.js 中创建一个几何体:

var dotGeometry = new THREE.Geometry();
dotGeometry.dynamic = true;

var createDot = function (group, x, y, z){
    group.vertices.push(new THREE.Vector3( x, y, z));
}

var width = 300;
var height = 300;
var gap = 0.1;

for(var i = 0; i < width; i++){
    for(var j = 0; j < height; j++){
        createDot(dotGeometry, i*gap, j*gap, 0);
    }
}

只要我使用点 Material ,一切正常 - 我可以看到我的几何图形:

var dotMaterial = new THREE.PointsMaterial( { size: 1, color: 0xffffff, sizeAttenuation: false } );
var dot = new THREE.Points( dotGeometry, dotMaterial );
scene.add( dot );

但是一旦我想使用任何其他 Material 来查看类似“实体”表面的东西,我就什么也看不到了,例如:

var dotMaterial = new THREE.MeshPhongMaterial( { color: 0xffffff } );
var dot = new THREE.Points( dotGeometry, dotMaterial );
scene.add( dot );

geometry 只能与 PointsMaterial 一起使用还是我做错了什么?

示例 1:工作

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);

var renderer = new THREE.WebGLRenderer();

var light = new THREE.PointLight(0xffffff, 1);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var dotGeometry = new THREE.Geometry();
dotGeometry.dynamic = true;

var createDot = function (group, x, y, z){
    group.vertices.push(new THREE.Vector3( x, y, z));
}

var width = 300;
var height = 300;
var gap = 0.1;

for(var i = 0; i < width; i++){
    for(var j = 0; j < height; j++){
        createDot(dotGeometry, i*gap, j*gap, 0);
    }
}

var dotMaterial = new THREE.PointsMaterial( { size: 1, color: 0xffffff, sizeAttenuation: false } );
var dot = new THREE.Points( dotGeometry, dotMaterial );

scene.add( dot );
scene.add(light);

camera.position.z = 5;
light.position.y = 2;
light.position.z = 5;
light.position.x = 0;

var render = function() {
  requestAnimationFrame(render);

  dot.rotation.x += 0.01;
  dot.rotation.y += 0.01;

  renderer.render(scene, camera);
};

render();
body {
  margin: 0;
}

canvas {
  width: 100%;
  height: 100%
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/87/three.min.js"></script>

示例 2:不工作

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);

var renderer = new THREE.WebGLRenderer();

var light = new THREE.PointLight(0xffffff, 1);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var dotGeometry = new THREE.Geometry();
dotGeometry.dynamic = true;

var createDot = function (group, x, y, z){
    group.vertices.push(new THREE.Vector3( x, y, z));
}

var width = 300;
var height = 300;
var gap = 0.1;

for(var i = 0; i < width; i++){
    for(var j = 0; j < height; j++){
        createDot(dotGeometry, i*gap, j*gap, 0);
    }
}

var dotMaterial = new THREE.MeshPhongMaterial( { color: 0xffffff } );
var dot = new THREE.Points( dotGeometry, dotMaterial );

scene.add( dot );
scene.add(light);

camera.position.z = 5;
light.position.y = 2;
light.position.z = 5;
light.position.x = 0;

var render = function() {
  requestAnimationFrame(render);

  dot.rotation.x += 0.01;
  dot.rotation.y += 0.01;

  renderer.render(scene, camera);
};

render();
body {
  margin: 0;
}

canvas {
  width: 100%;
  height: 100%
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/87/three.min.js"></script>

感谢您的帮助!

最佳答案

您可以做的是使用您的 geometry.vertices 来填充 ConvexGeometry (您需要链接到 ConvexGeometry.jsQuickHull.js)。

您像以前一样创建几何图形

dotGeometry.vertices.push(new THREE.Vector3(0, 0, 0));

然后您需要像这样将其传递给您的ConvexGeometry:

var geometry = new THREE.ConvexGeometry(dotGeometry.vertices);

之后,您可以像往常一样应用您的 Material 。

var material = new THREE.MeshPhongMaterial({
    color: 0xffffff
});
var mesh = new THREE.Mesh(geometry, material);

这是 CodePen 中的示例;

这是假设您需要一个凸形。如果您只需要一架飞机,请使用 PlaneGeometry .

r87

关于javascript - THREE.js 中的几何 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46355286/

相关文章:

javascript - 匹配不同类型的http类型字符串的正则表达式

javascript - 如何制作出像这样的页面效果呢?

javascript - 尝试通过 A-Frame 内的 Three.js 编辑 Material 的侧面属性会导致渲染不正确

three.js - Three.js索引BufferGeometry与InstancedBufferGeometry

javascript - 一个 HTML 页面上的多个 Three.js CSS3D 场景,分子示例

javascript - Angular UI Grid - 添加或删除列并更新数据

javascript - 从 javascript 函数验证参数的最佳方法是什么?

javascript - 帮助 jquery 选择器

javascript - 如何在 Three.js 中使用数组代替 MeshFaceMaterial?

javascript - 按钮移动相机 THREE.js