(function onLoad() {
var container, camera, scene, renderer, controls;
init();
animate();
function createModel() {
var radius0 = 60, radius1 = 20, height = 100,
startAngle = THREE.Math.degToRad(-20),
endAngle = THREE.Math.degToRad(110),
horSegs = 25, vertSegs = 25;
var width = radius0 * (endAngle-startAngle);
var plane = new THREE.PlaneGeometry(width, height, horSegs, vertSegs);
var index = 0;
for (var i = 0; i <= vertSegs; i++) {
for (var j = 0; j <= horSegs; j++) {
var angle = startAngle + j/horSegs * (endAngle - startAngle);
var vertRel = i/vertSegs;
var r_add = Math.sin(vertRel*Math.PI);
var radius = radius0 + radius1 * r_add;
plane.vertices[index].z = radius * Math.cos(angle);
plane.vertices[index].x = radius * Math.sin(angle);
index++;
}
}
plane.computeVertexNormals();
var material = new THREE.MeshLambertMaterial({
color: 0xa2cddd,
side: THREE.DoubleSide
});
var mesh = new THREE.Object3D();
var curve = new THREE.Mesh(plane, material);
curve.rotation.z = THREE.Math.degToRad(-90);
mesh.add(curve);
mesh.position.x=0
mesh.position.y=40
mesh.position.z=-20
scene.add(mesh);
}
function init() {
container = document.getElementById('container');
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
container.appendChild(renderer.domElement);
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
camera = new THREE.PerspectiveCamera(70, window.innerWidth/window.innerHeight, 1, 10000);
camera.position.set(-80, 40, -80);
scene.add(camera);
resize();
window.onresize = resize;
var ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.x = -2;
directionalLight.position.y = 2;
directionalLight.position.z = -4;
scene.add(directionalLight);
controls = new THREE.OrbitControls(camera, renderer.domElement);
\t \t
addGridHelper();
createModel();
}
function addGridHelper() {
var planeGeometry = new THREE.PlaneGeometry(2000, 2000);
planeGeometry.rotateX(-Math.PI/2);
var planeMaterial = new THREE.ShadowMaterial({
opacity: 0.2
});
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.position.y = -200;
plane.receiveShadow = true;
scene.add(plane);
var helper = new THREE.GridHelper(2000, 100);
helper.material.opacity = 0.25;
helper.material.transparent = true;
scene.add(helper);
var axis = new THREE.AxesHelper(1000);
scene.add(axis);
}
function resize() {
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = window.innerWidth/window.innerHeight;
camera.updateProjectionMatrix();
//controls.handleResize();
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
renderer.render(scene, camera);
}
})();
<script src="https://threejs.org/build/three.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>
この取得の近いように見えます。しかし、私が実際に探しているのは、次のようなカスタムメッシュを生成することではありません。https://ibb.co/kZW3hG 各ポイントは、ボリュームを作成せずに最も近いものに接続されます。その形状を作成するために得られる唯一の情報は、異なる3Dベクトルポイントの乱数(> 10)です。それが凹面か平面かが分かりません。私はイージングは必要ありません。この例のようなシャープなエッジは全く問題ありません:) – vinni
@vinniおそらく、任意の点群のソートアルゴリズムが必要です。 'THREE.PlaneGeometry'で使用できるソートされたポイントです。 – Rabbid76