- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 javascript/jquery(基于 DOM,而非 Canvas )构建某种拖放应用程序。
想法是能够在 3D 场景上拖动 div(在 3D 中旋转的 div)。
它在 2D 平面上工作,问题是当我在 3D 中旋转场景时,对象位置不反射(reflect)实际鼠标位置,而是在 3D 中转换的坐标
示例:
我希望对象相对于鼠标的绝对位置移动。
我这样计算鼠标位置:
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 平面图的鼠标坐标,但此时无法找到真正的解决方案。
关于此主题的大多数搜索结果都指向面向游戏的语言,或 canvas/webgl 问题。
有什么想法吗?
谢谢
最佳答案
假设您的鼠标位置是绝对屏幕位置,并且您想直接根据鼠标位置在 3D 平面上抓取和滑动对象:
您可以将 3D 目标平面表示为:
O
U
和 V
,代表 U 轴和 V 轴的方向那么,对应于平面坐标[u,v]
的给定3D点是:
point3d P = O + u*U + v*V
然后,您可以组合将此特定 3D 点映射到屏幕的操作;这通常用 3D 变换矩阵 ModelMatrix
、ViewMatrix
和 ProjectionMatrix
以及由 2D 屏幕原点 确定的视口(viewport)变换来描述origin_2d
和一个二维缩放向量 scale_2d
。为了以一种易于逆向的方式解决问题,通过为每个坐标添加 .w
坐标,将所有坐标提升为齐次坐标。这个额外的坐标充当比例因子——要得到笛卡尔坐标,您需要将齐次 .x
和 .y
值除以 .w
值:
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 矩阵;你应该能够反转它:
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
,如上所述。
关于javascript - 将鼠标坐标转换为 3D 平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12503219/
我是一个对 Haskell 感兴趣的初学者,我一直在尝试自己实现 flatmap (>>=) 以更好地理解它。目前我有 flatmap :: (t -> a) -> [t] -> [a] flatm
我正在尝试创建一个 searchBar,它通过带有请求的 MKLocalSearch 搜索地址并使用 RXSwift 并绑定(bind)到 RXCocoa 到目前为止,我已经完成了以下工作1.过滤和去
我正在使用 javascript/jquery(基于 DOM,而非 Canvas )构建某种拖放应用程序。 想法是能够在 3D 场景上拖动 div(在 3D 中旋转的 div)。 它在 2D 平面上工
我有这样的情况 class A { private B b; public B getB() { return b; } } 还有另一个B类 class B {
在链 obs1.flatmap(x -> obs2()).subscribe(sub) 如果 obs2 产生错误,它会立即调用 onError 在 sub 上。这是记录在案的: Note that i
在这篇文章中,平面图或平面图是指可以在平面(或等价物)中绘制的抽象图在球体上),以及根据特定此类绘图在每个顶点处的边的圆形顺序。这个额外的信息决定了球体上的嵌入(直到移动顶点和边,使得它们永远不会与任
我有一个 Flux 字符串。对于每个字符串,我必须进行远程调用。但问题是,进行远程调用的方法实际上返回的是 Mono 响应(显然,因为对应于单个请求,所以将有单个响应)。 处理此类情况的正确模式应该是
我对 MapPartition 没有搞清楚。请有人解释一下 Mappartition 的一些用例以及它与 FlatMap 有何不同? 最佳答案 区别在于方法的接口(interface)以及它们的调用方
我有这个问题,我有一个 RDD[(String,String, List[String]),我想“平面化”它以获得一个 RDD[(String ,字符串, 字符串)]: 例如: val x :RDD[
所以这将是我第一次无法通过搜索找到问题的答案.. 我对 D3 和 Javascript 总体来说还很陌生,我想要实现的是在浏览器中从 CAD 工具 (Autodesk Revit) 导出的一些曲线的可
我需要替换多年前构建的 Flash 查看器,以显示来自 AutoCAD 的交互式2D 平面图。 目前,AutoCAD 文件被读取并转换为 XML 文件,其中包含表示平面图对象的多边形的 X 和 Y 坐
我有 2 个 retrofit 电话需要进行 A 和 B: (A):返回一个ArrayList (B):获取 (A) 的结果,它是一个 ArrayList。 (B) 遍历 ArrayList 并使用每
我是一名优秀的程序员,十分优秀!