首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将鼠标坐标转换为三维计划

将鼠标坐标转换为三维计划
EN

Stack Overflow用户
提问于 2012-09-19 13:33:10
回答 1查看 2.2K关注 0票数 6

我在javascript/jquery (基于DOM,而不是画布)中构建某种拖放应用程序。

其想法是能够在3D场景(在3D中旋转的div )上拖动div。

它在2D平面上工作,问题是当我在3D中旋转场景时,物体的位置并不反映实际的鼠标位置,而是在3D中转换的坐标。

举例说明:

JSFIDDLE实例

我希望物体相对于鼠标的绝对位置移动。

我计算鼠标的位置如下:

代码语言:javascript
运行
AI代码解释
复制
document.addEventListener(gestureMove, function (event) {
  if (mouseDown == true) {
  event.preventDefault();
  moveX = (event.pageX - $('#scene').offset().left);
  moveY = (event.pageY - $('#scene').offset().top);
}

#scene { 
  width: 1000px;
  height: 1000px;
  -webkit-transform-style: preserve-3d;
  -webkit-transform: rotateX( 35deg ); 
}

早期的解决方案是根据初始位置计算鼠标位置和对象之间的差异,并在拖动期间将其添加到对象位置。这是可行的,但动画真的是波涛汹涌,一点也不顺利。

我确信有一种更简单的方法可以获得相对于3D计划的鼠标坐标,但在这一点上没有找到真正的解决方案。

关于这个主题的大多数搜索结果都指向面向游戏的语言,或画布/webgl问题。

有什么想法吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-09-19 14:40:55

假设您的鼠标位置是一个绝对的屏幕位置,并且您希望根据鼠标位置在3D平面上抓取和滑动一个对象:

您可以将您的三维目标平面表示为:

  • 三维原点O
  • 两个三维矢量UV,表示U轴和V轴的方向。

然后,与平面坐标[u,v]对应的给定的三维点是:

代码语言:javascript
运行
AI代码解释
复制
point3d P = O + u*U + v*V

然后,您可以组合将这个特定的3D点映射到屏幕上的操作;这通常由3D转换矩阵ModelMatrixViewMatrixProjectionMatrix以及由2D屏幕原点origin_2d和2D缩放矢量scale_2d确定的视口转换来描述。要以一种容易逆转的方式解决这个问题,请将所有内容推广到齐次坐标,向每个坐标添加一个.w-coordinate。这个额外的坐标充当一个缩放因子--要获得笛卡尔坐标,您需要将齐次.x.y值除以.w值:

代码语言:javascript
运行
AI代码解释
复制
P_hom = [u, v, 1] * [U.x, U.y, U.z, 0] = [u, v, 1] * TexMatrix
                    [V.x, V.y, V.z, 0]
                    [O.x, O.y, O.z, 1]

P_clip_hom = P_hom * ModelMatrix * ViewMatrix * ProjectionMatrix
           = P_hom * ModelViewProjectionMatrix

screenpos_hom = P_clip_hom * [scale_2d.x     0        0] = P_clip_hom * PortMatrix
                             [   0        scale_2d.y  0]
                             [   0           0        0]
                             [origin_2d.x origin_2d.y 1]

So, screenpos_hom = [u, v, 1] * TexMatrix * ModelViewProjectionMatrix * PortMatrix
                  = [u, v, 1] * TexToScreenMatrix

-> [screenpos.x, screenpos.y] = [screenpos_hom.x, screenpos_hom.y] / screenpos_hom.w

请注意,TexToScreenMatrix是一个3x3矩阵;您应该能够反转它:

代码语言:javascript
运行
AI代码解释
复制
UV_2d_hom = [screenpos.x, screenpos.y, 1] * (TexToScreenMatrix)^-1

-> [u, v] = [UV_2d_hom.x, UV_2d_hom.y] / UV_2d_hom.w

最后,您可以直接使用[u,v]坐标,也可以使用它们重新创建上面描述的3D点P

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12503219

复制
相关文章
js中settimeout和setInterval区别_JavaScript set
注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止
全栈程序员站长
2022/11/09
1.9K0
JavaScript 定时器 setTimeout、setInterval
定时器在javascript中的作用 1、制作动画 2、异步操作 3、函数缓冲与节流 定时器类型及语法 示例代码如下: /* 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行一次的定时器 setInterval 反复执行的定时器 clearInterval 关闭反复执行的定时器 */ var time1 = setTimeout(myalert,2000); var time2 = setInterval(
Devops海洋的渔夫
2019/05/30
9860
JavaScript如何用setTimeout模拟setInterval
思路就是递归调用 function myInterval(fun,time){ function inside(){ fun(); setTimeout(inside,time); } setTimeout(inside,time); } myInterval(fn,1000); function fn(){ console.log('嘿嘿'); }
henu_Newxc03
2022/05/05
9440
javascript中的setTimeout() 方法和clearInterval() 方法和setInterval() 方法
语法 setTimeout(code,millisec) 参数 描述 code 必需。要调用的函数后要执行的 JavaScript 代码串。 millisec 必需。在执行代码前需等待的毫秒数。 提示和注释 提示:setTimeout() 只执行 code 一次。 <html> <head> <script type="text/javascript"> function timedMsg() { var t=setTimeout("alert('5 seconds!')",5000) } </scrip
用户7657330
2020/08/14
1.3K0
setTimeout和setInterval
setTimeout(methodName, interval); //间隔时间单位为毫秒,表示interval毫秒后执行方法methodName
tandaxia
2018/09/27
2K0
setTimeout和setInterval
新建 html 文件 21-setTimeout.html ,编写下方程序,运行看看效果吧
鹤川
2023/03/21
1.1K0
javascript当中时间控制setTimeout和setInterval的用法
9.时间控制setTimeout和setInterval 马克-to-win:下个例子说明每秒刷新时间如何实现。(利用setTimeout方法): setTimeout和setInterval的区别是:setTimeout只执行1次,而setInterval可以无限执行。 例 1.9.1(setTimeoutIEFF.html) <HTML> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <SCRIPT LANGUAGE="JavaScript"> <!-- function time() { var now = new Date(); var y = now.getFullYear(); var m = now.getMonth()+1; var d = now.getDate(); var x = now.getDay(); var hour = now.getHours(); var day =new Array("日","一","二","三","四","五","六"); var xingqi = day[x]; var mi =now.getMinutes(); var s = now.getSeconds(); var t =document.getElementById("t"); t.innerHTML="今天是"+y+"年"+m+"月"+d+"日"+"星期"+xingqi+","+hour+":"+mi+":"+s; setTimeout("time()",1000); } //--> </SCRIPT> </HEAD> <BODY οnlοad="time()"> <div id="t"></div> </BODY> </HTML> setInterval&clearInterval
马克java社区
2021/01/18
6460
javascript当中时间控制setTimeout和setInterval的用法
JavaScript定时调用函数(SetInterval与setTimeout)
setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。
aehyok
2018/09/11
1.5K0
setInterval 和 setTimeout 用法
setInterval 定时器,开始执行后,每间隔指定时间执行一次,除非清除定时器 用法: setInterval(function(){ 方法… },1000);// 间隔时间 setTimeout 是在指定的时间后,执行该事件 用法: setTimeout(function(){ 方法…. },1000); clearInterval(); // 清除定时器 <html> <head> <title>js</title> </head> <body> <script> test();
IT架构圈
2018/06/01
1K0
使用setTimeout模拟setInterval
相信setInterval这个东西大火都比较熟了,这里不做关于它的介绍,而是关于本文是如何实现这一功能。
kifuan
2022/10/24
1.8K0
利用setTimeout和SetInterval构建Javascript计时器
看到了一篇深入浅出的讲解setTimeout和setInterval的例子,直接讲英文贴出来吧,也不是很难。
大江小浪
2018/07/24
8080
深度解密setTimeout和setInterval——为setInterval正名!
重复定时器,JS有一个方法叫做setInterval专门为此而生,但是大家diss他的理由很多,比如跳帧,比如容易内存泄漏,是个没人爱的孩子。而且setTimeout完全可以通过自身迭代实现重复定时的效果,因此setIntervval更加无人问津,而且对他退避三舍,感觉用setInterval就很low。But!setInverval真的不如setTimeout吗?请大家跟着笔者一起来一步步探索吧!
小美娜娜
2019/04/04
4K0
深度解密setTimeout和setInterval——为setInterval正名!
Vue中 使用定时器 (setInterval、setTimeout)[通俗易懂]
js中定时器有两种,一个是循环执行 setInterval,另一个是定时执行 setTimeout。
全栈程序员站长
2022/11/10
7.7K0
Vue中 使用定时器 (setInterval、setTimeout)[通俗易懂]
setTimeout实现setInterval和clearInterval[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
4990
为什么要用 setTimeout 模拟 setInterval ?
在[JS 事件循环之宏任务和微任务](../Performance/JS事件循环之宏任务和微任务.html)中讲到过,setInterval 是一个宏任务。
九旬
2021/01/06
1.2K0
js中settimeout和setinterval的区别是什么?
javascript的setTimeOut和setInterval函数应用非常广泛,在网站中经常用来处理延时延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。
跟着阿笨一起玩NET
2020/09/16
1.5K0
js中的this关键字,setTimeout(),setInterval()的执行过程
var test1 = { name: 'windseek1', showname: function () { console.log(this.name); } } var test2 = { name:'windseek2', showname: test1.showname } test2.showname() 运算结果是windseek2,由于test2.showname=test1.showname所以test2.showname()=test1.showname(); test2.shown
windseek
2018/06/14
1.3K0
为什么要用 setTimeout 模拟 setInterval ?
来源:九旬 https://segmentfault.com/a/1190000038829248
@超人
2021/02/26
1.2K0
为什么要用 setTimeout 模拟 setInterval ?
第46天:setInterval与setTimeout的区别
js的setTimeout方法用处比较多,通常用在页面刷新了、延迟执行了等等。今天对js的setTimeout方法做一个系统地总结。
半指温柔乐
2018/09/11
1.3K0
点击加载更多

相似问题

JavaScript setTimeout setInterval

21

Javascript setTimeout/setInterval

20

setInterval Javascript中的javascript睡眠....setTimeout

22

javascript - setTimeout() vs setInterval()

30

JavaScript setTimeout和setInterval

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文