Three.js - 获取鼠标单击的 X、Y 和 Z 坐标

2024-01-06

我在用着版本68三个.js。

我想单击某处并获取 X、Y 和 Z 坐标。我按照此处的步骤操作,但它们给我的 Z 值为 0:鼠标/画布 X、Y 到 Three.js 世界 X、Y、Z https://stackoverflow.com/questions/13055214/mouse-canvas-x-y-to-three-js-world-x-y-z

基本上,如果我在场景中有一个网格,然后单击它的中间,我希望能够计算出与该网格的位置相同的值。这只是一个例子。我知道我可以使用光线投射来查看是否与网格体发生碰撞,然后检查其位置。但是,即使我没有单击网格,我也希望它能够工作。

这可能吗?这是一个jsfiddle:http://jsfiddle.net/j9ydgyL3/ http://jsfiddle.net/j9ydgyL3/

在那个 jsfiddle 中,如果我能够设法单击该正方形的中心,我希望分别计算 X、Y 和 Z 值 10、10、10,因为这些是正方形位置的坐标。下面是大家关心的两个函数:

function getMousePosition(clientX, clientY) {
    var mouse2D = new THREE.Vector3();
    var mouse3D = new THREE.Vector3();
    mouse2D.x = (clientX / window.innerWidth) * 2 - 1;
    mouse2D.y = -(clientY / window.innerHeight) * 2 + 1;
    mouse2D.z = 0.5;
    mouse3D = projector.unprojectVector(mouse2D.clone(), camera);
    return mouse3D;
    //var vector = new THREE.Vector3(
    //( clientX / window.innerWidth ) * 2 - 1,
    //- ( clientY / window.innerHeight ) * 2 + 1,
    //0.5 );

    //projector.unprojectVector( vector, camera );
    //var dir = vector.sub( camera.position ).normalize();
    //var distance = - camera.position.z / dir.z;
    //var pos = camera.position.clone().add( dir.multiplyScalar( distance ) );
    //return pos;
}

function onDocumentMouseUp(event) {
    event.preventDefault();

    var mouse3D = getMousePosition(event.clientX, event.clientY);
    console.log(mouse3D.x + ' ' + mouse3D.y + ' ' + mouse3D.z);
}

我留下了一些我尝试注释掉的其他代码。请注意,这段注释掉的代码在 jsfiddle 网站中不起作用,可能是因为他们仍在使用 Three.js 的 54 版本。它在我的 68 版本机器上运行良好。

Edit:澄清一下,我希望无论鼠标在哪里都能够获取坐标。我在这个例子中只使用了一个网格,因为通过查看计算的坐标是否与网格的坐标相同,可以很容易地验证它是否有效。我真正想要的是它无需在网格上使用光线投射即可工作。例如,我们可以让它在每次鼠标移动时始终将计算出的坐标打印到控制台,无论场景中有什么。


你应该使用THREE.Raycaster https://threejs.org/docs/#api/core/Raycaster为了这。当您设置一个列表时intersectObjects您将能够获得与射线相交的对象数组。因此,您可以从返回的列表中的“单击”对象中获取位置。在这里检查更新的小提琴 http://jsfiddle.net/j9ydgyL3/2/。 我还把你的Three.js改成了R68版本

为了更高级地使用THREE.RayCaster检查示例Threejs.org/examples http://threejs.org/examples/ like 这个带有交互式立方体的示例 http://threejs.org/examples/#webgl_interactive_cubes.

相关代码来自更新了小提琴 http://jsfiddle.net/j9ydgyL3/2/:

function getMousePosition(clientX, clientY) {
    var mouse2D = new THREE.Vector3();
    var mouse3D = new THREE.Vector3();
    mouse2D.x = (clientX / window.innerWidth) * 2 - 1;
    mouse2D.y = -(clientY / window.innerHeight) * 2 + 1;
    mouse2D.z = 0.5;
    mouse3D = projector.unprojectVector(mouse2D.clone(), camera);
    return mouse3D;
    var vector = new THREE.Vector3(
    (clientX / window.innerWidth) * 2 - 1, -(clientY / window.innerHeight) * 2 + 1,
    0.5);

    projector.unprojectVector(vector, camera);
    var dir = vector.sub(camera.position).normalize();
    var distance = -camera.position.z / dir.z;
    var pos = camera.position.clone().add(dir.multiplyScalar(distance));
    return pos;
}

function onDocumentMouseUp(event) {
    event.preventDefault();

    var mouse3D = getMousePosition(event.clientX, event.clientY);
    console.log(mouse3D.x + ' ' + mouse3D.y + ' ' + mouse3D.z);

var vector = new THREE.Vector3( mouse3D.x, mouse3D.y, 1 );    
    raycaster.set( camera.position, vector.sub( camera.position ).normalize() );

    var intersects = raycaster.intersectObjects(scene.children );
    if(intersects.length > 0){
        console.log(intersects[0].object.position);
    }
}

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

function render() {
    renderer.render(scene, camera);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Three.js - 获取鼠标单击的 X、Y 和 Z 坐标 的相关文章

  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 在 Javascript 中减少/分组数组

    基于this https stackoverflow com a 40774906 3254598例如 我想以稍微不同的方式按对象进行分组 结果应该如下 key audi items make audi model r8 year 2012
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没

随机推荐

  • pm安装错误的包名

    我最近制作了一个新应用程序 只有一个最小的 MainActivity 存根 当我使用 Android Studio 和 gradle 项目运行应用程序时 应用程序失败并显示以下消息 Uploading file local path C U
  • 如何在Java中更快地解压缩XZ文件?

    我的 SQLite 数据库文件大小为 85MB 使用 XZ 格式压缩 大小已减小到 16MB 我使用以下代码 以及由Java 的 XZ http tukaani org xz java html 在Android Jelly Bean中解压
  • 四舍五入双精度值,同时保留尾随零

    这是我的函数 将数字四舍五入到小数点后两位 但是当四舍五入的数字为 1 50 时 它似乎忽略尾随零并只返回 1 5 public static double roundOff double number double accuracy 20
  • Python re.sub:忽略替换字符串中的反向引用

    我想用字符串替换模式 该字符串在变量中给出 当然 它可能包含 1 并且不应将其解释为反向引用 而应简单地解释为 1 我怎样才能做到这一点 之前的答案使用re escape 会转义太多 并且您会在替换和替换字符串中得到不需要的反斜杠 似乎在
  • 如何限制用户在输入元素中输入10位数字?

    我想为电话号码创建一个输入字段 我正在使用 JavaScript 动态创建输入字段
  • 带对齐的字符串格式货币

    print this is 0 gt 10 2f format 3 44 打印出 this is 3 44 即分开 从金额 有没有办法在金额旁边的正确位置打印带有货币符号的间隔列 例如 this is 3 44 I tried print
  • MongoDB:使用 2 个嵌套数组更新文档中的平均值

    我有以下 MongoDB 文档 id ObjectId company name Name registered 2 21 2015 2 00 trucks truck id TEB7622 weight 88 33 capacity 27
  • CamelCase JSON WebAPI 子对象(嵌套对象、子对象)

    我正在创建一个复杂的对象 其中包含要从我的 Web api 控制器返回的子对象 嵌套对象 该对象包含其他对象类型的列表 列表中的这些子对象类型遵循 NET 中使用的 pascal 大小写 var persons peopleLookup V
  • 如何最好地将模糊的 ProgressBar 放置在屏幕上的 ConstraintLayout 上?

    当我单击 登录 按钮时 会显示一个进度条 我通过在顶部添加一个工具栏对布局进行了修改 似乎该工具栏现在遮盖了进度栏 如何使该进度条在屏幕中央的某个位置可见 非常感谢您的帮助 布局xml代码如下所示 活动登录 xml
  • Chrome、Safari 和 Firefox 中内联块元素之间的幽灵空间 [重复]

    这个问题在这里已经有答案了 如何删除内联块元素之间的幽灵空间 这是一个jsfiddlehttp jsfiddle net hFDcV http jsfiddle net hFDcV 您可以清楚地看到 div 之间的水平空间 StackOve
  • 忽略实体框架中的特定列? [复制]

    这个问题在这里已经有答案了 我从实体框架版本 4 1 10331 0 中的数据库自动生成了模型 我想忽略实体中的列 而不使用 Fluent Api 且不更改ObjectContext into DbContext 当然 不会从 SQL 表中
  • 使用 pdfmake 在段落周围添加边框

    我正在通过生成pdfpdfmake http bpampuch github io pdfmake 假设我有这样的 pdf 内容 var docDefinition content Lorem ipsum dolor sit amet co
  • Python 中的字符串是池化的吗?

    Python 是否有一个所有字符串的池 并且它们 字符串 是单例吗 更准确地说 在下面的代码中 是在内存中创建了一个还是两个字符串 a str num b str num 字符串在 Python 中是不可变的 因此实现可以决定是否实习 这是
  • heroku 上的 Hapi 服务器无法绑定端口

    我正在为 ReactJS 应用程序开发 Hapi 服务器 但当我尝试部署到 Heroku 时 收到 R10 错误 无法在启动后 60 秒内绑定到 PORT 到底是怎么回事 我正在使用 process env PORT 我也尝试过 parse
  • Web 应用程序安全的好指南? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我非常擅长制作网络应用程序 并且知道如何在客户端 服务器等之间传输数据 尽管学习如何使数据交换更安全 但我需要一些帮助 这就是为什么我有点害怕发
  • 如何在 C++ 中存储变量数据

    我正在创建一个存储有关特定数据源的元数据的类 元数据采用树状结构 与 XML 的结构非常相似 元数据值可以是整数 小数或字符串值 我很好奇 C 中是否有一种好方法来存储这种情况的变体数据 我希望变体使用标准库 因此我避免使用可用的 COM
  • Numba:如何抑制

    我的 numba 代码中不断出现此错误 Warning 101 0 Unused argument self 我的 numba 代码如下 如何抑制错误消息 autojit def initialise output data self in
  • 使用 $switch 将分数添加到 MongoDB 聚合

    我正在尝试根据哪个值向我的 mongodb 聚合添加一个分数name字段匹配 例如 如果name与 sitt 完全匹配 得分为100 如果name匹配 sitt i 得分为 50 这是我的代码 db getCollection tags a
  • 构造函数参数的求值顺序[重复]

    这个问题在这里已经有答案了 假设我有这门课 struct A A int int int 我这样初始化它 A a b c 功能在哪里a b and c 全部返回int 应该a 之前被调用b and b before c 我对标准中的以下段落
  • Three.js - 获取鼠标单击的 X、Y 和 Z 坐标

    我在用着版本68三个 js 我想单击某处并获取 X Y 和 Z 坐标 我按照此处的步骤操作 但它们给我的 Z 值为 0 鼠标 画布 X Y 到 Three js 世界 X Y Z https stackoverflow com questi