定制three.js的模型的可視化操作界面


three.js自帶一個dat.gui.js,可以方便地對一個模型創建可視化操作界面,如圖:

但有時候界面的風格和整體不搭,而且這界面修改起來挺麻煩。通過對模型的屬性的了解,我們是可以對模型進行參數面板的定制的。

前期准備:three.js,jquery.js,jquery-ui.js,為了美觀點,可以再下載個bootstrap包導入。

准備完成,我們就可以開始了。這里舉個簡單的例子:

html部分

<!DOCTYPE html>

<html>
<head>
    <meta charset="UTF-8">
    <title>簡單的一個梨子</title>
    <link rel="stylesheet" href="./css/index.css">
    <link rel="stylesheet" href="./css/bootstrap.min.css">
    <link rel="stylesheet" href="./css/jquery-ui.min.css">
    <script type="text/javascript" src="js/three.js"></script>
    <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="js/jquery-ui.min.js"></script>
</head>
    <body>
        <!-- 放置主場景 -->
        <div id="output">
        </div>
        <!-- 放置模型參數界面 -->
        <div id="cube-ui">
            <button type="button" class="btn btn-default cube-ui_button"><p>折疊收縮</p></button>
            <div class="panel panel-default cube-ui_cube">
                <div class="cube-ui_cube_depth">
                    <p align=right>長度:</p>
                    <div class="cube-ui_slider" id="cube-depth-slider"></div>
                    <input type="text" id="cube-depth-input" value="0"/>
                </div>
                <div class="cube-ui_cube_width">
                    <p align=right>寬度:</p>
                    <div class="cube-ui_slider" id="cube-width-slider"></div>
                    <input type="text" id="cube-width-input" value="0"/>
                </div>
                <div class="cube-ui_cube_height">
                    <p align=right>高度:</p>
                    <div class="cube-ui_slider" id="cube-height-slider"></div>
                    <input type="text" id="cube-height-input" value="0"/>
                </div>
            </div>
        </div>
        <script type="text/javascript" src="js/cubeUI.js"></script>
        <script type="text/javascript" src="js/init.js"></script>

    </body>

</html>

css部分


body {
    margin: 0;
    overflow: hidden;
}

#cube-ui{
    position:absolute;
    z-index:1;
    right:0;
    top:0;
    display:block;
}

.cube-ui_button{
    position:absolute;
    right:0;
    width: 250px;
    height: 30px;
    margin: 0 0 2px 0;
    display: block;
}

.cube-ui_button p{
    color:#000;
}

.cube-ui_cube{
    width:100%;
    height:30px;
    margin:5px 0 0 0;
}

.geometry-parameter p{
    position:absolute;
    right:182px;
    margin:5px 0 0 0;
    width:65px;
}

.geometry-parameter .huadongtiao{
    position:absolute;
    right:50px;
    margin:8px 0 0 0;
    width:130px;
}

.geometry-parameter input{
    position:absolute;
    right:5px;
    margin:4px 0 0 0;
    width:40px;
    height:20px;
    text-align:center
}

#cube-ui .panel{
    position:absolute;
    top:35px;
    right:0;
    height: 120px;
    width: 250px;
    display: none;
}

 js部分

這里我們創建兩個js(init.js,cubeUI.js)。init.js用來創建場景及模型,cubeUI.js實現參數面板對模型的操作。

init.js:

 
 var scene,camera,webGLRenderer,spotLight;
 
 function init(){
 	//場景
	scene = new THREE.Scene();
	//相機
	camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
	camera.position.set(-20,30,40);
	camera.lookAt(new THREE.Vector3(10, 0, 0));
	//渲染器
	webGLRenderer = new THREE.WebGLRenderer();
	webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));
	webGLRenderer.setSize(window.innerWidth, window.innerHeight);
	webGLRenderer.shadowMapEnabled = true;
	document.getElementById("output").appendChild(webGLRenderer.domElement);
	//燈光
	spotLight = new THREE.SpotLight(0xffffff);
	spotLight.position.set(-40, 60, -10);
	scene.add(spotLight);
	//創建一個立方體
	var cube = createMesh(new THREE.BoxGeometry(10, 10, 10));
	cube_ui(cube);
	scene.add(cube);
	
	render();
}

window.onload = init;

//渲染
function render(){
    webGLRenderer.render(scene, camera);
}

//給立方體附加材質
function createMesh(geom){
    var meshMaterial = new THREE.MeshNormalMaterial();
    meshMaterial.side = THREE.DoubleSide;
    var mesh = new THREE.Mesh(geom, meshMaterial);
    mesh.position.set(0,0,0);
    return mesh;
}
    

 cubeUI.js:

//折疊收縮立方體UI
$(document).ready(function(){
	$(".btn").click(function(){ 
		$(".panel").slideToggle("slow");
		return false;
	});
});

var objUI = [];

//存儲立方體參數ui中的組件id
var cubeUiParameters = {
	depth_slider: "cube-depth-slider",
	width_slider: "cube-width-slider",
	height_slider: "cube-height-slider",
	
	depth_input: "cube-depth-input",
	width_input: "cube-width-input",
	height_input: "cube-height-input",
};

//立方體的相關變量
var cubeParameters = {
	depth: 0,
	width: 0,
	height: 0,
};

//通過改變input中的值,改變模型
$("#"+cubeUiParameters.depth_input+",#"+cubeUiParameters.width_input+",#"+cubeUiParameters.height_input).change(function(){
	//取到input中的值
	cubeParameters.depth = document.getElementById(cubeUiParameters.depth_input).value;
	cubeParameters.width = document.getElementById(cubeUiParameters.width_input).value;
	cubeParameters.height = document.getElementById(cubeUiParameters.height_input).value;
	//將取到的值賦給滑動條
	$("#"+cubeUiParameters.depth_slider).slider("value",cubeParameters.depth);
	$("#"+cubeUiParameters.width_slider).slider("value",cubeParameters.width);
    $("#"+cubeUiParameters.height_slider).slider("value",cubeParameters.height);
    //更新模型
	updateCube(cubeParameters.width,cubeParameters.height,cubeParameters.depth);
});


//初始化滑動條的輸入框的值
function cube_ui(cube){
	objUI = [];
	objUI.push(cube);
	//取得立方體的長、寬、高
	document.getElementById(cubeUiParameters.depth_input).value = cube.geometry.parameters.depth;
	document.getElementById(cubeUiParameters.width_input).value = cube.geometry.parameters.width;
	document.getElementById(cubeUiParameters.height_input).value = cube.geometry.parameters.height;
	cubeParameters.depth = cube.geometry.parameters.depth;
	cubeParameters.width = cube.geometry.parameters.width;
	cubeParameters.height = cube.geometry.parameters.height;
	
    //生成滑動條
	$("#"+cubeUiParameters.depth_slider+",#"+cubeUiParameters.width_slider+",#"+cubeUiParameters.height_slider).slider({
    	min:0,
    	max:500,
    	step:1,
    	value:0,
    	slide:function(event,ui){
    		$(this).slider("value",ui.value);
    		cube_value();
    	}
    });

    //給滑動條賦值
	$("#"+cubeUiParameters.depth_slider).slider("value",cubeParameters.depth);
	$("#"+cubeUiParameters.width_slider).slider("value",cubeParameters.width);
	$("#"+cubeUiParameters.height_slider).slider("value",cubeParameters.height);

}

//取到滑條的值賦給input框並更新立方體
function cube_value(){
cubeParameters.depth = $("#"+cubeUiParameters.depth_slider).slider("value"); cubeParameters.width = $("#"+cubeUiParameters.width_slider).slider("value"); cubeParameters.height = $("#"+cubeUiParameters.height_slider).slider("value"); document.getElementById(cubeUiParameters.depth_input).value = cubeParameters.depth; document.getElementById(cubeUiParameters.width_input).value = cubeParameters.width; document.getElementById(cubeUiParameters.height_input).value = cubeParameters.height;
updateCube(cubeParameters.width,cubeParameters.height,cubeParameters.depth); } //創建改變參數的立方體 function updateCube(width,height,depth){ //刪除改變前模型 objUI[0].geometry.dispose(); scene.remove(objUI[0]); objUI = []; var cube = createMesh(new THREE.CubeGeometry(width, height, depth)); cube.position.set(0,0,0); objUI.push(cube); scene.add(cube); render(); }

 至此,我們就完成了我們的目標,讓我們來看看效果吧:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM