raycaster選取捕獲obj模型&&選中高亮代碼


raycaster選取捕獲obj模型&&選中高亮代碼

raycaster關鍵代碼

raycaster默認狀態下是無法讀取obj模型, 因為模型是自動加載到一個組里的, 因此需要調用intersectObject方法

//原來的代碼
//raycaster.setFromCamera(mouse, camera);

//第二個參數一定要為ture,這樣才能捕獲group的所有children
var intersects = raycaster.intersectObject(group, true);

選中高亮代碼

  function onDocumentClick(event) {
      //阻值默認動作
        event.preventDefault();
      //鼠標轉為屏幕中的
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
        raycaster.setFromCamera( mouse, camera );
        var intersects = raycaster.intersectObject( group, true);

      //拾取物體數大於0時
      if ( intersects.length > 0 ) {
            // intersects[ 0 ].object.material.color.set( 0xff0000 );
            //獲取第一個物體
            if (INTERSECTED != intersects[0].object) {
                if (SELECTED) SELECTED.material.color.setHex(SELECTED.currentHex);
                SELECTED = intersects[0].object;
                // console.log(SELECTED);
                SELECTED.currentHex = SELECTED.material.color.getHex();//記錄當前選擇的顏色
                SELECTED.material.color.setHex(0x66ff00);

        } else {
            // document.body.style.cursor = 'auto';
            if (SELECTED) SELECTED.material.color.set(SELECTED.currentHex);//恢復選擇前的默認顏色
            SELECTED = null;
        }
    }
  
    document.addEventListener('click', onDocumentClick, false);

obj整體上色

搞不來啊啊啊啊啊啊啊啊啊啊啊啊

每次點了都是選中模型的children部分,哭了....

曲線救國了...以后看看有沒有什么好辦法

目前是想先把obj存到group中,然后判斷group里模型的id是否與obj.parent.parent.id是否相等,相等就把回調模型,重新上色加載, 手動測出的id為3

以下是完整代碼

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="three.js"></script><!--引入threejs核心庫-->
    <script src="OrbitControls.js"></script><!--引入相機控制器-->
    <script src="OBJLoader.js"></script><!--obj加載器-->
    <script src="LoaderSupport.js"></script>
    <script src="MTLLoader.js"></script><!--材質加載器,材質加載還有點問題-->
    <script src="OBJLoader2.js"></script>
    <script src="js/jsUtils-RichardWLee.js"></script>
</head>
<body>
<script>
    var mouse = new THREE.Vector2(), INTERSECTED, SELECTED;
    var raycaster = new THREE.Raycaster();
    // var objects = [];

    var group = new THREE.Group();


    var scene = new THREE.Scene();<!--創建場景-->
    scene.background = new THREE.Color(0xf0f0f0);


    var geometry = new THREE.BoxGeometry(100, 100, 100);
    var material = new THREE.MeshLambertMaterial({color: 0xffffff});
    var mesh = new THREE.Mesh(geometry, material);<!--mesh即網格模型,創建需要兩個參數:幾何體和材質-->
    scene.add(mesh);<!--將模型加入場景-->


    group.add(mesh);
    scene.add(group);


    var loader = new THREE.OBJLoader();
    var plane_obj;

    loader.load('models/成品.obj',
        function (object) {
            plane_obj = object;
            object.scale.set(0.1, 0.1, 0.1);<!--縮小10倍-->
            object.position.y = 50;
            object.traverse(function (child) {
                if (child instanceof THREE.Mesh) {
                    child.material.color.setHex(0xFFFF00);
                }
            });

            scene.add(object);<!--加載成功的回調函數,將模型加載到場景中-->
            group.add(object);
        }
    );


    var light = new THREE.PointLight(0xffffff);<!--創建點光源:白色-->
    light.position.set(300, 400, 200);<!--設置點光源位置-->
    scene.add(light);<!--將光源加入場景-->

    scene.add(new THREE.AmbientLight(0x555555));<!--添加淺灰色的環境光-->
    var camera = new THREE.PerspectiveCamera(40, 800 / 600, 1, 2000);<!--創建透視相機-->
    camera.position.set(200, 200, 200);
    camera.lookAt(scene.position);<!--把相機朝向場景中心-->
    //用來搞事情

    function onDocumentClick(event) {
        event.preventDefault();
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
        raycaster.setFromCamera(mouse, camera);
        var intersects = raycaster.intersectObject(group, true);

        //拾取物體數大於0時
        if (intersects.length > 0) {
            //獲取第一個物體
            if (INTERSECTED != intersects[0].object) {

                //調試用的
                //console.log(intersects);
                //console.log(intersects[0].object.parent.parent.id);

                //這里判斷group中的模型id是否為3
                if (intersects[0].object.parent.parent.id == 3) {
                    SELECTED = intersects[0].object;
                    SELECTED.currentHex = SELECTED.material.color.getHex();
                    plane_obj.traverse(function (child) {
                        if (child instanceof THREE.Mesh) {
                            child.material.color.setHex(0xFF00FF);
                        }
                    });
                } else {
                    if (SELECTED) {
                        SELECTED.material.color.setHex(SELECTED.currentHex);
                    }

                    SELECTED = intersects[0].object;

                    SELECTED.currentHex = SELECTED.material.color.getHex();//記錄當前選擇的顏色
                    SELECTED.material.color.setHex(0x66ff00);
                }
            }


        } else {
            if (SELECTED) {
                SELECTED.material.color.set(SELECTED.currentHex);//恢復選擇前的默認顏色
                plane_obj.traverse(function (child) {
                    if (child instanceof THREE.Mesh) {
                        child.material.color.setHex(0xFFFF00);
                    }
                });
            }
            SELECTED = null;
        }


    }


    document.addEventListener('click', onDocumentClick, false);


    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);<!--將渲染器加入網頁元素中-->

    function render() {


        renderer.render(scene, camera);<!--將相機看到的場景渲染到頁面中-->
    }

    render();
    var controls = new THREE.OrbitControls(camera);
    controls.addEventListener('change', render);

    function animate() {
        requestAnimationFrame(animate);
        render();
    }

    animate();<!--動畫函數,每一幀都渲染-->


</script>
</body>
</html>


免責聲明!

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



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