Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 使用dat.gui自定义几何图形的形状_Three.js_Dat.gui - Fatal编程技术网

Three.js 使用dat.gui自定义几何图形的形状

Three.js 使用dat.gui自定义几何图形的形状,three.js,dat.gui,Three.js,Dat.gui,我正在尝试创建一个可以由dat.GUI自定义的对象。我希望几何体的形状由用户更改,而不仅仅是旋转和位置。我尝试在代码的渲染部分添加正在创建的几何体的代码部分,但每次我更改几何体的形状时,它都会创建几何体。请帮我处理这件事 <head> <title> </title> <link type="text/css" rel="stylesheet" href="stylesheet3.css"/> <script src="three.mi

我正在尝试创建一个可以由dat.GUI自定义的对象。我希望几何体的形状由用户更改,而不仅仅是旋转和位置。我尝试在代码的渲染部分添加正在创建的几何体的代码部分,但每次我更改几何体的形状时,它都会创建几何体。请帮我处理这件事

<head>

<title> 
</title>

<link type="text/css" rel="stylesheet" href="stylesheet3.css"/>
<script src="three.min.js"> </script>
<script src="dat.gui.min.js"></script>
<script src="dat.gui.js"></script>
<script src="OrbitControls.js"></script>
</head>
<body>
    <div id="container"></div>
<!--<script src="main.js"> </script>-->
<script type="text/javascript">

        var camera, scene, renderer;
        var cameraControls, effectController;
        var clock = new THREE.Clock();
        var gridX = true;
        var gridY = false;
        var gridZ = false;
        var axes = true;
        var ground = true;
        var arm, forearm, body;
        setupGui(); 
        fillScene();
        function fillScene() {
            scene = new THREE.Scene();
            scene.fog = new THREE.Fog( 0x808080, 2000, 4000 );

            // LIGHTS
            var ambientLight = new THREE.AmbientLight( 0x222222 );
            var light = new THREE.DirectionalLight( 0xFFFFFF, 1.0 );
            light.position.set( 200, 400, 500 );
            var light2 = new THREE.DirectionalLight( 0xFFFFFF, 1.0 );
            light2.position.set( -500, 250, -200 );
            scene.add(ambientLight);
            scene.add(light);
            scene.add(light2);

            // Material
            var bodyMaterial = new THREE.MeshPhongMaterial( { color: 0x279933, specular: 0x279933, shininess: 100 } );

            body = new THREE.Object3D();


            keyboardBase = new THREE.Object3D();
            drawKeyboardBase(keyboardBase, bodyMaterial)



            var dummy = new THREE.Object3D();
            dummy.position.x = -100;
            scene.add( dummy );



            scene.add(keyboardBase);
            //dummy.add(key1LeftFace);
            //body.add(key1RightFace);
            //scene.add(body);
            //scene.add(dummy);


        }



        function drawKeyboardBase(part, material)
        {
            var geometry = new THREE.PlaneGeometry( 400,400,1,1);
            var basePlane = new THREE.Mesh(geometry,material);
            basePlane.material.side = THREE.DoubleSide;
            basePlane.rotation.x = 90 * Math.PI/180;

            part.add(basePlane);
        }

        function init() {
            var canvasWidth = 846;
            var canvasHeight = 494;
            var canvasRatio = canvasWidth / canvasHeight;
            var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
            var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
            camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR); 
            // RENDERER
            renderer = new THREE.WebGLRenderer( { antialias: true } );
            renderer.gammaInput = true;
            renderer.gammaOutput = true;
            renderer.setSize(canvasWidth, canvasHeight);
            renderer.setClearColor( 0xAAAAAA, 1.0 );

            // CAMERA

            camera.position.set( 0, 100, 1000 );
             camera.lookAt(scene.position);

            cameraControls = new THREE.OrbitControls( camera, renderer.domElement );



            }

        function addToDOM() {
            var container = document.getElementById('container');
            var canvas = container.getElementsByTagName('canvas');
            if (canvas.length>0) {
                container.removeChild(canvas[0]);
            }
            container.appendChild( renderer.domElement );
        }

        function animate() {
            window.requestAnimationFrame(animate);

            render();
        }

        function render() {
            var delta = clock.getDelta();


            //this the block of code that I mentioed, every time I change the shape, a shape is created!                          
            var squareGeometry = new THREE.Geometry();
             squareGeometry.vertices.push(new THREE.Vector3(-200.0*Math.tan(Math.PI*(effectController.ky/180)/2)*2*Math.sin(Math.PI*(effectController.ky/180)/2),  100, 0.0));
             squareGeometry.vertices.push(new THREE.Vector3( 0,  100, 0.0));    
             squareGeometry.vertices.push(new THREE.Vector3( 0, -100.0, 0.0));
             squareGeometry.vertices.push(new THREE.Vector3(-200.0*Math.tan(Math.PI*(effectController.ky/180)/2)*2*Math.sin(Math.PI*(effectController.ky/180)/2), -100.0, 0.0));
             squareGeometry.faces.push(new THREE.Face3(1, 2, 3));
             squareGeometry.faces.push(new THREE.Face3(3, 1, 0));
             var rightPlane = new THREE.Mesh(squareGeometry,new THREE.MeshPhongMaterial( { color: 0x6E23BB, specular: 0x6E23BB, shininess: 20 } ));
             rightPlane.material.side = THREE.DoubleSide;
             rightPlane.rotation.x = 90 * Math.PI/180;
             scene.add(rightPlane);


            rightPlane.rotation.y = effectController.ky * Math.PI/180;
            renderer.render(scene, camera);
        }

        function setupGui() {

            effectController = {


                ky: -120.0
            };

            var gui = new dat.GUI();
            var h = gui.addFolder("Arm angles");

            h.add(effectController, "ky", -120.0, -60.0, 0.025).name("Plane angle");
        }


        try {
            init();
            fillScene();
            addToDOM();
            //setupGui();
            animate();
        } catch(e) {

        }


</script>
</body>


摄像机、场景、渲染器;
var摄像机控制器、效应控制器;
var clock=新的三个时钟();
var gridX=true;
var gridY=false;
var gridZ=false;
var轴=真;
var地面=真;
前臂,前臂,身体;
setupGui();
fillScene();
函数fillScene(){
场景=新的三个。场景();
scene.fog=新的3.fog(0x80808020004000);
//灯光
var环境光=新的三个环境光(0x22222);
var灯光=新的三方向灯光(0xFFFFFF,1.0);
光。位置。设置(200400500);
var light2=新的三方向光(0xFFFFFF,1.0);
灯2.位置设置(-500250,-200);
场景。添加(环境光);
场景。添加(灯光);
场景。添加(light2);
//材料
var bodyMaterial=新的三点网格材质({颜色:0x279933,镜面反射:0x279933,光泽度:100});
body=new THREE.Object3D();
keyboardBase=new THREE.Object3D();
drawKeyboardBase(键盘底座,车身材料)
var dummy=new THREE.Object3D();
虚拟位置x=-100;
场景。添加(虚拟);
场景.添加(键盘基座);
//dummy.add(key1LeftFace);
//主体。添加(键1右侧);
//场景。添加(主体);
//场景。添加(虚拟);
}
功能绘图键盘底座(零件、材料)
{
变量几何=新的三个平面几何(400400,1,1);
var基准面=新的三个网格(几何体、材质);
基面.material.side=3.DoubleSide;
基准面旋转x=90*Math.PI/180;
部分。添加(基准面);
}
函数init(){
var canvasWidth=846;
var canvasHeight=494;
var画布比率=画布宽度/画布高度;
变量SCREEN\u WIDTH=window.innerWidth,SCREEN\u HEIGHT=window.innerHeight;
可变视角=45,纵横比=屏幕宽度/屏幕高度,近=0.1,远=20000;
摄像机=新的三个透视摄像机(视角、方向、近距离、远距离);
//渲染器
renderer=new THREE.WebGLRenderer({antialas:true});
renderer.gammaInput=true;
renderer.gammaOutput=true;
渲染器.setSize(画布宽度、画布高度);
setClearColor(0xAAAAAA,1.0);
//摄像机
摄像机位置设置(0、100、1000);
摄像机。注视(场景。位置);
cameraControls=新的三个.OrbitControls(camera、renderer.DoElement);
}
函数addToDOM(){
var container=document.getElementById('container');
var canvas=container.getElementsByTagName('canvas');
如果(画布长度>0){
container.removeChild(canvas[0]);
}
container.appendChild(renderer.doElement);
}
函数animate(){
window.requestAnimationFrame(动画);
render();
}
函数render(){
var delta=clock.getDelta();
//这就是我记忆中的代码块,每次我改变形状,就会创建一个形状!
var squareGeometry=新的三个.Geometry();
squareGeometry.Vertexs.push(新的三个.Vector3(-200.0*Math.tan(Math.PI*(effectController.ky/180)/2)*2*Math.sin(Math.PI*(effectController.ky/180)/2),100,0.0);
squareGeometry.Vertexs.push(新的三向量3(01000,0.0));
squareGeometry.Vertexs.push(新的三个向量3(0,-100.0,0.0));
squareGeometry.Vertexs.push(新的三个.Vector3(-200.0*Math.tan(Math.PI*(effectController.ky/180)/2)*2*Math.sin(Math.PI*(effectController.ky/180)/2),-100.0,0.0);
正方形几何。面。推(新的三面3(1,2,3));
正方形几何面推(新的三面3(3,1,0));
var rightPlane=新的三网格(方形几何体,新的三网格材质({颜色:0x6E23BB,镜面反射:0x6E23BB,光泽度:20}));
rightPlane.material.side=3.DoubleSide;
右平面旋转x=90*Math.PI/180;
场景.添加(右平面);
rightPlane.rotation.y=effectController.ky*Math.PI/180;
渲染器。渲染(场景、摄影机);
}
函数setupGui(){
效应控制器={
肯塔基州:-120.0
};
var gui=new dat.gui();
var h=gui.addFolder(“手臂角度”);
h、 添加(effectController,“ky”、-120.0、-60.0、0.025)。名称(“平面角度”);
}
试一试{
init();
fillScene();
addToDOM();
//setupGui();
制作动画();
}捕获(e){
}

在fillscene函数中创建正方形几何体

然后,看起来需要将两个顶点的x坐标更改为某个值。在动画中执行此操作:

function animate() {
    window.requestAnimationFrame(animate);

    squareGeometry.vertices[0].x = whatever;
    squareGeometry.vertices[3].x = whatever;
    squareGeometry.verticesNeedUpdate = true; // ask for an update

    render();
}

不需要改变面孔

在fillscene函数中创建正方形几何体

然后,看起来需要将两个顶点的x坐标更改为某个值。在动画中执行此操作:

function animate() {
    window.requestAnimationFrame(animate);

    squareGeometry.vertices[0].x = whatever;
    squareGeometry.vertices[3].x = whatever;
    squareGeometry.verticesNeedUpdate = true; // ask for an update

    render();
}

不需要改变面孔

在fillscene函数中创建正方形几何体

然后,看起来需要将两个顶点的x坐标更改为某个值。在动画中执行此操作