首页 > 其他分享 >threejs-模型点击以及添加CSS2DObject

threejs-模型点击以及添加CSS2DObject

时间:2022-09-30 16:55:41浏览次数:62  
标签:容器 threejs domElement labelRenderer 点击 zoom CSS2DObject window event

模型点击事件网上教程挺多的,官网好像也有demo,这里我就只记录我碰到的问题以及解决方案:

首先要清楚一件事,就是模型的展示需要一个容器,当这个容器是body|window 和 非全屏的容器时,是有区别的,全屏的坐标拾取方法:

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

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

非全屏:

         let getBoundingClientRect = container.getBoundingClientRect()
        mouse.x = ((event.clientX - getBoundingClientRect .left) / container.offsetWidth) * 2 - 1;
        mouse.y = -((event.clientY - getBoundingClientRect .top) / container.offsetHeight) * 2 + 1;

 

非全屏,且有存在缩放问题:【我这里用的一个框架, 会根据屏幕的比例和浏览器的缩放比例去自动适应。达到布局不变。容器位置看起来也不变】当存在缩放且不是全局容器时:

    let div3DLeft = (window.innerWidth - renderer.domElement.clientWidth * zoom) / 2; // 由于容器位置看起来不变,所以直接用window来计算。
    let div3DTop = window.innerHeight - renderer.domElement.clientHeight * zoom;

    // 这里获取容器距离 window的 left 和top,

    // renderer.domElement.clientWidth * zoom, 容器的实际大小会被缩放, 所以需要乘以 缩放比例zoom   

   mouse.x =  ((event.clientX - div3DLeft) / (renderer.domElement.clientWidth * zoom)) * 2 -1;
    mouse.y = -((event.clientY - div3DTop) /(renderer.domElement.clientHeight * zoom)) *2 +1;

 

添加CSS2DObject

分为三个步骤:

 1:创建css2dobject    【const divLabel = new CSS2DObject(div);】

  labelRenderer.setSize(dom.clientWidth, dom.clientHeight);【设置大小和属性】
  labelRenderer.domElement.style.position = "absolute";
  labelRenderer.domElement.style.top = "0px";
  labelRenderer.domElement.style.outline = "none";
  labelRenderer.domElement.style.zIndex = "-999";

2.   创建 渲染器 render 【labelRenderer = new CSS2DRenderer();】,添加到容器下:【dom.appendChild(labelRenderer.domElement);】

3.控制器:【controls = new OrbitControls(
    camera,
    labelRenderer.domElement
  );】

4.渲染  【labelRenderer.render(scene, camera);】

5. 更新 【function animate() {
  //更新控制器
  render();
  //更新性能插件
  controls.update();
  requestAnimationFrame(animate); //告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行
}

标签:容器,threejs,domElement,labelRenderer,点击,zoom,CSS2DObject,window,event
From: https://www.cnblogs.com/Hijacku/p/16745434.html

相关文章

  • 周年庆活动火热进行中!你想了解的都在这,点击即可查看更多活动详情!
    好消息!好消息!好消息!为迎接引迈信息三周年来临之际,我司特推出此次周年庆典活动,以此回馈这些年来一直支持着我们的客户与合作商们。这三年走来,引迈不断创新,不断突破,致力......
  • 22.实例:利用JS点击百度翻译
    Dimtemp,hWeb,sRet,待翻译的文字//变量赋值待翻译的文字="早上好"//绑定浏览器hWeb=WebBrowser.BindBrowser("chrome",10000,{"bContinueOnError":false,"......
  • 10.利用JS点击元素
    例1:利用JS点击“百度一下”按钮,执行JS代码为:function(){document.querySelector("#su").click();return123}其中su为按钮的元素ID变量状态的代码:"function()document......
  • Vscode中点击自动eslint格式化和prettier搭配
    eslint规则只是限制我们在写代码时候的标准化,尤其是在团队开发中成员的代码一致性,如果大家都是自己的标准,那么写出的项目将没有办法进行阅读,不利于后期的二次开发vscode自......
  • element-ui 上传文件后点击图片实现预览效果
    背景在我们上传文件后我们希望点击文件实现预览效果进行确认或者其他操作。方式1:可以使用element-ui的upload组件+dialog+image组件解决,示例代码如下:<el-uploada......
  • CSS实现按钮点击时缩小后放大的效果
    #down_button_android{width:100%;transition:transform0.3s;}#down_button_android:active{t......
  • vue2.x引入threejs
    @目录vue2.x引入threejsnpm安装使用指定版本:其他插件实例强调vue2.x引入threejsnpm安装npminstallthree使用指定版本:npminstallthree@<版本号>其他插件因为本......
  • 直播网站源码,点击按钮Button,更换背景颜色
    直播网站源码,点击按钮Button,更换背景颜色代码实现drawable目录下:1、btn_nopress_shape.xml <?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="http://......
  • jquery实现点击复制微信号并自动打开微信加好友​
    近期,有建网站客户要求实现在自己的手机网站上实现点击复制微信号并自动打开微信加好友的功能。怎么在自己建网站时,制作出这样的点击复制微信号并自动打开微信加好友功能呢?......
  • js、jq获取当前点击元素的下标
    JS中获取元素下标//获取到所有的li标签varli=technical.querySelectorAll("li")//遍历li标签for(leti=0;i<li.length;i++){//将i的下标赋值到li的index......