three.js 事宜交互

访客3年前关于黑客接单1019

在three.js中,展示的一切内容都是在canvas中绘制的,以是点击事宜点击到物体上是无法获取点击工具的,要获取点击的工具要使用RayCaster,用于在三维空间中举行鼠标拾取,原理是:相机与鼠标所在的装备坐标之间的连线经由哪些物体。

var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();

function onMouseMove( event ) {

	// 将鼠标位置归一化为装备坐标。x 和 y 偏向的取值局限是 (-1 to +1)

	mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
	mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

}

function render() {

	// 通过摄像机和鼠标位置更新射线
	raycaster.setFromCamera( mouse, camera );

	// 盘算物体和射线的焦点
	var intersects = raycaster.intersectObjects( scene.children );

	for ( var i = 0; i < intersects.length; i++ ) {

		intersects[ i ].object.material.color.set( 0xff0000 );

	}

	renderer.render( scene, camera );

}

window.addEventListener( 'mousemove', onMouseMove, false );

window.requestAnimationFrame(render);

特别注意
    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
是针对全屏的情形,若是是一个div局限,窗口的宽度与高度要改成div的宽度与高度,event.clientX与ent.clientY也要改成event.layerX 与event.layerY

若是我们要区别点的是哪个物体,要为这个物体设置一个name 属性

 var sprite = new THREE.Sprite(new THREE.SpriteMaterial({ color: "#69f", name: spriteName }));
 sprite.position.set(0, 2, 5);
 sprite.scale.set(20, 2, 1);
 sprite.name = spriteName;

在点击的时刻显示这个名字

alert(selectObject.name)

也可以凭据名称差别展示差别的数据 或者跳转到另一个页面

window.location.href = "test111.html";


完整的代码

<!DOCTYPE html>
<html lang="en">

<head>
    <title>three.js webgl - raycast - sprite</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <style>
    body {
        margin: 0;
    }

    .canvasWrap {
        width: 1000px;
        height: 500px;
        background: gray;
    }
    </style>
</head>

<body>
    <div id="title" style="display:none;">this is the title</div>
    <div class="0bb0-85bb-fe62-2501 canvasWrap" id="canvasWrap"></div>
    <script src="../../build/three.js"></script>
    <script src="../js/controls/OrbitControls.js"></script>
    <script>
    var renderer, scene, camera;
    var controls, group;
    var spriteName = "quanju naem"
    init()
    animate()

    var widht, height;

    function init() {
        width = document.getElementById('canvasWrap').clientWidth;
        height = document.getElementById('canvasWrap').clientHeight;
        //init renderer
        renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(width, height);
        document.getElementById('canvasWrap').appendChild(renderer.domElement);

        //init scene
        scene = new THREE.Scene();
        scene.background = new THREE.Color(0x000000);
        console.log(scene.position) // Vector3 {x: 0, y: 0, z: 0}

        group = new THREE.Group();
        scene.add(group);

        //int camera
        camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 1000);
        camera.position.set(15, 15, 15);
        camera.lookAt(scene.position);

        controls = new THREE.OrbitControls(camera, renderer.domElement);
        controls.enableRotate = true;

        //add sprites
        var sprite = new THREE.Sprite(new THREE.SpriteMaterial({ color: "#69f" }))
        sprite.position.set(6, 5, 5);
        sprite.scale.set(2, 5, 1);
        sprite.name = spriteName + " 1";
        group.add(sprite);

        var sprite = new THREE.Sprite(new THREE.SpriteMaterial({ color: "green" }));
        //sprite.material.rotation = Math.PI/3*4; //等同于(Math.PI/3)*4逆时针旋转240度
        sprite.position.set(8, -2, 2); //感受position的位置是精灵的中央在三维坐标中的位置
        sprite.center.set(0.5, 0.5); //精灵的center设定是基于精灵的巨细的,精灵的的左下角为(0,0),x轴的右边与y轴的上方为正
        sprite.scale.set(1, -5, 1);
        sprite.name = spriteName + " 2";

        group.add(sprite);

        var group2 = new THREE.Object3D();
        //group2.scale.set(1,2,1);
        group2.position.set(-5, 0, 0);
        //group2.rotation.set(Math.PI/2,0,0);
        group.add(group2);

        //var sprite = new THREE.Sprite(new THREE.SpriteMaterial({color:"#69f",name:"hihi"}));
        var sprite = new THREE.Sprite(new THREE.SpriteMaterial({ color: "#69f", name: spriteName }));
        sprite.position.set(0, 2, 5);
        sprite.scale.set(20, 2, 1);
        sprite.name = spriteName;

        //sprite.center.set(-0.1,0);
        //sprite.material.rotation = Math.PI/3;
        group2.add(sprite);

        window.addEventListener("resize", onWindowResize, false);
        window.addEventListener("click", onDocumentMouseMove, false)

    }

    function animate() {
        renderer.render(scene, camera);
        requestAnimationFrame(animate)
    }

    function onWindowResize() {
        width = document.getElementById('canvasWrap').clientWidth;
        height = document.getElementById('canvasWrap').clientHeight;
        camera.aspect = width / height;
        camera.updateProjectionMatrix();
        renderer.setSize(width, height);
    }

    var selectObject = null;

    function onDocumentMouseMove(event) {
        event.preventDefault();
        if (selectObject) {
            console.log(selectObject);
            selectObject.material.color.set("#69f");
            selectObject = null;
        }

        var intersects = getIntersects(event.layerX, event.layerY);
        if (intersects.length > 0) {
            var res = intersects.filter(function(res) {
                return res && res.object
            })[0];
            if (res && res.object) {
                //console.log(res)
                selectObject = res.object;
                alert(selectObject.name)


                selectObject.material.color.set("#ffc466")
                var title = document.getElementById("title");
                title.style.display = "block";

                //window.location.href = "test111.html";

            }
        }
    }
    var raycaster = new THREE.Raycaster();
    var mouseVector = new THREE.Vector2();

    function getIntersects(x, y) {
        //将鼠标位置转换成装备坐标。x和y偏向的取值局限是(-1 to 1)
        x = (x / width) * 2 - 1;
        y = -(y / height) * 2 + 1;
        mouseVector.set(x, y);

        //通过摄像机和鼠标位置更新射线
        raycaster.setFromCamera(mouseVector, camera);

        // 返回物体和射线的焦点
        return raycaster.intersectObject(group, true)
    }
    </script>
</body>

</html>
思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

黑客怎样黑别人的qq,中国网络 黑客,网站黑客在哪里找

各大东西包渠道的添加情况该黑客团伙曩昔曾运用过一些较为常见的进犯手法,比方污损网站或运用分布式拒绝服务进犯(DDoS)。 在2013年4月7日,该团伙运用DoS进犯和数据走漏对很多以色列网站造成了有史...

黑客帝国动作捕捉(黑客帝国武打动作)

黑客帝国动作捕捉(黑客帝国武打动作)

本文导读目录: 1、黑客帝国如何超级跳 2、黑客帝国的剧情问题?? 3、当年李连杰为什么拒拍《黑客帝国》 4、黑客帝国的剧情 5、电脑游戏:黑客帝国3:尼奥之路隐藏物品和出招表 6...

微赚钱钱?行使微信赚钱的这八种方法你知道吗?

手机微信发展趋势的愈来愈快速,坚信很多人现在都市用微信赚钱,例如开微店,微信上发表文章等,因此 怎样运用微信赚钱呢,下边我就给大伙儿详细先容运用微信赚钱的八种方式 1.接广告宣传,硬性广告和软文广告...

贝加尔湖旅游游玩攻略及注意事项!

贝加尔湖旅游游玩攻略及注意事项!

一直喜欢旅行,每次想一个旅游景点,然后做准备攻略都很心焦。所以想把每次我的攻略都分享出来。第一篇文章就用我准备了很久的贝加尔湖吧。 一 准备 办签证千万要提前去把签证办了,不管是自己搞定还是找...

黑客技术丨教你远程操控手机,实现定位追踪+实时监控?_定位地址

从网上得知,全国人大代表李翠枝提出建议,将“一生饮奶计划”纳入国家战略,实现学生饮用奶从幼儿园到高中的全覆盖,同时建议将跨境电商税率与一般贸易税率等同,将婴幼儿配方奶粉从跨境电商清单中剔除。 可以看出...

2020查开放房记录 查开房记录如何查

那天,正在看资料,朋友丢了个URL过来,说是SA注入点,但数据库和WEB分离的,搞了半天没搞定.我一听,SA注入点,应该很容易的说,于是就很随意的说,OK,没问题,等会给结果~ 手工大概的判断了下,的...