質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

Q&A

0回答

272閲覧

[Three.js] ShapeGeometry に テクスチャマッピンングをしたい

tsubakiii

総合スコア0

Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

0グッド

0クリップ

投稿2022/06/21 05:17

マッピンングがうまくできません。
修正点を教えてください。

  1. drawShape() 図形を作成
  2. createMesh() イメージを貼り付けるために作成
  3. var shape = createMesh(new THREE.ShapeGeometry(drawShape()), "hanami_01.jpeg");
    scene.add(shape);
<html> <head> <title>sample</title> <script type="text/javascript" src="../libs/three.js"></script> <script type="text/javascript" src="../libs/stats.js"></script> <script type="text/javascript" src="../libs/dat.gui.js"></script> <style> body { /* set margin to 0 and overflow to hidden, to go fullscreen */ margin: 0; overflow: hidden; } </style> </head> <body> <div id="Stats-output"> </div> <!-- Div which will hold the Output --> <div id="WebGL-output"> </div> <!-- Javascript code that runs our Three.js examples --> <script type="text/javascript"> // once everything is loaded, we run our Three.js stuff. function init() { var stats = initStats(); // create a scene, that will hold all our elements such as objects, cameras and lights. var scene = new THREE.Scene(); // create a camera, which defines where we're looking at. var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); // create a render and set the size var webGLRenderer = new THREE.WebGLRenderer(); webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0)); webGLRenderer.setSize(window.innerWidth, window.innerHeight); webGLRenderer.shadowMapEnabled = true; // add the sphere to the scene var shape = createMesh(new THREE.ShapeGeometry(drawShape()), "hanami_01.jpeg"); scene.add(shape); var sphere1 = createMesh(new THREE.SphereGeometry(6, 20, 20), "uma.png"); sphere1.Color sphere1.position.x = 30; sphere1.position.y = 47; scene.add(sphere1); var sphere2 = createMesh(new THREE.SphereGeometry(6, 20, 20), "uma.png"); sphere2.position.x = -30; sphere2.position.y = 47; scene.add(sphere2); // position and point the camera and lights camera.position.x = 100; camera.position.y = 40; camera.position.z = 150; camera.lookAt(new THREE.Vector3(20, 20, 100)); var light = new THREE.SpotLight(); light.position.set(0, 50, 100); light.intensity = 1.2; scene.add(light); var spotlight = new THREE.SpotLight(0xFFFFFF, 4, 30, Math.PI / 4, 10, 0.5); scene.add(spotlight); // add the output of the renderer to the html element document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement); // call the render function var step = 0; // setup the control gui var controls = new function () { this.amount = 2; this.bevelThickness = 2; this.bevelSize = 0.5; this.bevelEnabled = true; this.bevelSegments = 3; this.bevelEnabled = true; this.curveSegments = 12; this.steps = 1; this.asGeom = function () { // remove the old plane scene.remove(shape); // create a new one var options = { amount: controls.amount, bevelThickness: controls.bevelThickness, bevelSize: controls.bevelSize, bevelSegments: controls.bevelSegments, bevelEnabled: controls.bevelEnabled, curveSegments: controls.curveSegments, steps: controls.steps }; shape = createMesh(new THREE.ExtrudeGeometry(drawShape(), options)); // add it to the scene. scene.add(shape); }; }; var gui = new dat.GUI(); controls.asGeom(); render(); // 動物の顔を描く function drawShape() { // create a basic shape var shape = new THREE.Shape(); // startpoint 始まりの点 shape.moveTo(0, 50); // the top of the figure, curve to the right 制御点 //顔面 shape.bezierCurveTo(20, 50, 30, 40, 26, 30); //(制御点x1,y1,x2,y2,仮終点x,y) shape.bezierCurveTo(35, 15, 35, 10, 30, 2); shape.bezierCurveTo(20, -2, 19, 2, 0, 2); shape.bezierCurveTo(-19, 2, -20, -2, -30, 2); shape.bezierCurveTo(-35, 10, -35, 15, -26, 30); shape.bezierCurveTo(-30, 40, -20, 50, 0, 50); // add 'eye' hole one 丸 var hole1 = new THREE.Path(); hole1.absellipse(12, 25, 4, 6, 0, Math.PI * 2, true); shape.holes.push(hole1); // add 'eye hole 2' var hole2 = new THREE.Path(); hole2.absellipse(-12, 25, 4, 6, 0, Math.PI * 2, true); shape.holes.push(hole2); // add 'nose' var hole3 = new THREE.Path(); hole3.absarc(0, 22, 2, 1, Math.PI * 2, true); shape.holes.push(hole3); return shape; } function createMesh(geom, imageFile) { var wireFrameMat = new THREE.MeshBasicMaterial(); wireFrameMat.wireframe = true; var texture = THREE.ImageUtils.loadTexture("./" + imageFile); var material = new THREE.MeshPhongMaterial({ color: 0xffffff, map: texture, transparent: true }); var mesh = new THREE.Mesh(geom, material); return mesh; } function render() { stats.update(); sphere1.rotation.x += 0.01; sphere2.rotation.x += 0.01; // render using requestAnimationFrame requestAnimationFrame(render); webGLRenderer.render(scene, camera); } function initStats() { var stats = new Stats(); stats.setMode(0); // 0: fps, 1: ms // Align top-left stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.getElementById("Stats-output").appendChild(stats.domElement); return stats; } } window.onload = init; </script> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問