Raycaster--当物体放在容器中并做了转换,交点坐标不对的问题。

交点坐标问题

  • 问题
  • 解决x
    • 关键点
  • 总结

问题

子代放在了一个容器里,容器做了旋转、位移。
递归获得了最近的相交子代获取到的交点坐标并不是想要的交点坐标。
经过可视化观察,很像是没转换之前的坐标点。

解决x

在 Three.js 中,当你使用 Raycaster 获取与一个子对象的相交点时,返回的相交点信息是相对于世界坐标系的。如果你的子对象被包含在一个已经做了旋转或其他变换的容器中,你需要将相交点转换到子对象的本地坐标系中。

为了将相交点从世界坐标系转换到子对象的本地坐标系,你可以使用 Three.js 提供的 Object3D 方法 worldToLocal

以下是一个示例,展示了如何将相交点从世界坐标系转换到子对象的本地坐标系:

import * as THREE from 'three';

// 创建场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建一个容器并做旋转变换
const container = new THREE.Object3D();
container.rotation.y = Math.PI / 4; // 旋转45度
scene.add(container);

// 添加一个子对象到容器中
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const child = new THREE.Mesh(geometry, material);
container.add(child);

camera.position.z = 5;

// 创建 Raycaster 和射线
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();

// 事件监听器,用于捕捉鼠标点击事件
document.addEventListener('click', onMouseClick, false);

function onMouseClick(event) {
  // 计算鼠标在 NDC (Normalized Device Coordinates) 中的位置
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

  // 设置 Raycaster 的射线方向
  raycaster.setFromCamera(mouse, camera);

  // 计算与场景中所有对象的相交点
  const intersects = raycaster.intersectObjects(scene.children, true);

  if (intersects.length > 0) {
    const intersect = intersects[0];
    console.log('Intersected object:', intersect.object);

    // 相交点在世界坐标系中的位置
    const worldIntersection = intersect.point.clone();
    console.log('World intersection:', worldIntersection);

    // 将相交点转换到相交对象的本地坐标系中
    const localIntersection = intersect.object.worldToLocal(worldIntersection);
    console.log('Local intersection:', localIntersection);
  }
}

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

animate();

关键点

  • 旋转容器:将子对象添加到一个旋转的容器中。
  • 获取相交点:使用 Raycaster 获取相交点,该相交点是相对于世界坐标系的。
  • 转换相交点:使用 intersect.object.worldToLocal(intersect.point.clone()) 将相交点从世界坐标系转换到子对象的本地坐标系中。

总结

当子对象位于一个做了变换(如旋转、缩放、平移)的容器中时,从 Raycaster 获取的相交点是相对于世界坐标系的。为了将相交点转换到子对象的本地坐标系中,需要使用 worldToLocal 方法。这种转换可以帮助你正确地在子对象的本地坐标系中处理相交点。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/726254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍如何解决vcomp140.dll丢失的步骤,分享几种vcomp140.dll修复方法

当这个vcomp140.dll文件丢失时,可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到vcomp140.dll丢失的问题,但是这并不是不可解决的困难。接下来就和大家分享几种解决vcomp140.dll丢失的方法,给大家详细的关于如何解决vcomp140.dll…

matplotlib 做饼图

饼图可以很好地帮助用户快速了解整体市场数据的占比分配 import matplotlib.pyplot as pltexplode (0,0.1,0,0) labels Frogs,Hogs,Dogs,Logs sizes [15, 30, 45, 10] fig,ax plt.subplots() # colors 设置图形颜色 ;pctdistance:设置百分比标签与圆心的距离&am…

MacBook Air M3的电脑怎么样 新买MacBook Air提示内存不足 苹果电脑内存不够用怎么办

Apple的MacBook Air系列一直是轻薄便携笔记本电脑的代表,最新推出的MacBook Air M3因其出色的性能和优雅的设计而受到广泛关注。然而,许多用户在购买全新的MacBook Air后反应他们遇到了内存不足的提示。 本文将探讨MacBook Air M3的电脑怎么样&#xff0…

【MySQL】事务二

事务二 1.数据库并发的场景2.读-写2.1 3个记录隐藏字段2.2 undo日志2.3 模拟 MVCC2.4 Read View2.5 RR 与 RC的本质区别 3.读-读4.写-写 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我…

示例:应用DependencyPropertyDescriptor监视依赖属性值的改变

一、目的:开发过程中,经常碰到使用别人的控件时有些属性改变没有对应的事件抛出,从而无法做处理。比如TextBlock当修改了IsEnabled属性我们可以用IsEnabledChanged事件去做对应的逻辑处理,那么如果有类似Background属性改变我想找…

太湖远大毛利率下滑:研发费用率远低同行,募投项目合理性疑点重重

《港湾商业观察》黄懿 6月20日,浙江太湖远大新材料股份有限公司(以下简称“太湖远大”,873743.NQ)即将迎来过会。 2023年11月30日,太湖远大所提交的上市申请材料正式获北交所受理,保荐机构为招商证券&…

DataWorks Copilot:大模型时代数据开发的新范式

导读 DataWorks 是阿里云一站式智能化数据开发与治理平台,支持搭配MaxCompute/Hologres/AnalyticDB/StarRocks/EMR/CDH 等大数据引擎,为企业构建数据仓库、数据湖以及湖仓一体(Lakehouse)现代数据架构提供数据平台产品解决方案。…

数据结构_二叉树

目录 一、树型结构 二、二叉树 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储 2.5 遍历二叉树 2.6 操作二叉树 总结 一、树型结构 树是一种非线性的数据结构,它是由 n(n>0) 个有限结点组成一个具有层次关系的集合,一棵 n 个…

程控漏电流测试电阻箱的应用

程控漏电流测试电阻箱是用于测量和控制电流的设备,广泛应用于电力系统、电子设备、自动化设备等领域。它的主要功能是通过改变电阻值来控制电流的大小,从而实现对设备的保护和控制。 程控漏电流测试电阻箱在电力系统中有着重要的应用,电力系统…

调教NewspaceGPT之GPT4o实战

NewspaceGPT地址:https://newspace.ai0.cn 需求一:我需要一个创意logo 我的问题 我觉得我的描述对一个设计人员来说时精准的,但是不具体的。 需求描述:我需要一个logo。 表现司法公正和司法数字化,人工智能化 。 Ne…

微信聊天记录导出为电脑文件实操教程(附代码)

写在前面 最近,微信中加的群有点多,信息根本看不过来。如果不看,怕遗漏了有价值的信息;如果一条条向上翻阅,实在是太麻烦。 有没有办法一键导出所有聊天记录? 一来翻阅更方便一点,二来还可以…

乐鑫esp32系列睡眠模式下蓝牙连接功耗测试,新支持ESP-C6,启明云端乐鑫代理商

本教程适用于ESP32-S3、ESP32-C3、ESP32-C6; 睡眠模式介绍 ESP32系列常见的休眠方式有三种,分别为Modem-sleep、Light-sleep 和 Deep-sleep。 Modem-sleep模式:CPU 正常工作,可以对时钟进行配置。 进入 Modem-sleep 模式后&…

康谋分享丨从CAN到CAN FD:ADTF在汽车网络中的应用

来源:康谋分享丨从CAN到CAN FD:ADTF在汽车网络中的应用 原文链接:https://mp.weixin.qq.com/s/qCrsXV0D8No3bH6QsgupHg 欢迎关注虹科,为您提供最新资讯! #CAN #CAN FD #ADTF 随着汽车电子技术的发展,车辆…

直播电商源码(直播带货,短视频带货,DIY首页,商城运营)

随着互联网技术的飞速发展,直播电商已成为数字营销的新宠儿。直播电商源码作为支撑这一商业模式的技术基础,其重要性不言而喻。本文将深入探讨直播电商源码的概念、功能以及在现代电商领域的应用。 直播电商源码概述 直播电商源码,简而言之…

【C++题解】1324 - 扩建鱼塘问题

问题:1324 - 扩建鱼塘问题 类型:分支问题 题目描述: 有一个尺寸为 mn 的矩形鱼塘,请问如果要把该鱼塘扩建为正方形,那么它的面积至少增加了多少平方米? 输入: 两个整数 m 和 n 。 输出&…

北京大学数字普惠金融指数(2011-2022年)

北京大学数字普惠金融指数(2011-2022年),包含省市县三级数据 数据年限:省级、地级市(2011-2022年);区县(2014-2022年) 数据格式:excel、pdf 数据来源&#xf…

作为老司机,网站啥调性,第一屏就看出来了,还需往里看么。

网站的第一屏指的是用户在打开网站时首先看到的内容区域。这个区域通常包括网站的头部、导航栏、主要的视觉元素和重要的信息。第一屏的设计和呈现方式会对用户的第一印象产生重要影响,因此它能够决定网站的整体调性。 以下是一些原因解释为什么第一屏决定了网站的整…

[SAP ABAP] MESSAGE消息处理

常用的MESSAGE命令的字符 信息类型描述EError 出现错误消息,应用程序在当前点暂停 WWarning 出现警告消息,用户必须按Enter键才能继续应用程序 IInformation 将打开一个弹出窗口,其中包含消息文本,用户必须按Enter键才能继续 SSu…

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone

为了提高个人数据的安全性,用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能,但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码,您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…

Python12 列表推导式

1.什么是列表推导式 Python的列表推导式(list comprehension)是一种简洁的构建列表(list)的方法,它可以从一个现有的列表中根据某种指定的规则快速创建一个新列表。这种方法不仅代码更加简洁,执行效率也很…