cla*_*l3r 5 java opengl math 3d processing
在处理(java方言)中有方法screenX,screenY(和screenZ,但我们现在跳过它).
假设我有一个xyz = 50,100,500的对象.然后使用screenX和screenY,你现在可以在画布上显示它们的位置.
float x = screenX(50, 100, 500);
float y = screenY(50, 100, 500);
这里是参考:http: //processing.org/reference/screenX_.html
我感兴趣的是反方法.例如,我想在x = 175和y = 100的画布上使用球体到apear.球体应该具有700的az.然后,实际的x和y位置在z = 700处,使其在画布上以175,100的形式出现?
所以该方法将是float unscreenX(float x, float y, float z),它将返回x值.
我的数学/编程技巧不是那么先进(让我们称之为糟糕)(我更像是设计师)所以我正在寻求一些帮助.我已经准备好在加工板上问过了,但是这里有更多的人对矩阵等有更深入的了解.
处理中的常规screenX方法可以在这里找到:https: //github.com/processing/processing/blob/master/core/src/processing/opengl/PGraphicsOpenGL.java
public float screenX(float x, float y, float z) {
return screenXImpl(x, y, z);
}
protected float screenXImpl(float x, float y, float z) {
float ax =
modelview.m00*x + modelview.m01*y + modelview.m02*z + modelview.m03;
float ay =
modelview.m10*x + modelview.m11*y + modelview.m12*z + modelview.m13;
float az =
modelview.m20*x + modelview.m21*y + modelview.m22*z + modelview.m23;
float aw =
modelview.m30*x + modelview.m31*y + modelview.m32*z + modelview.m33;
return screenXImpl(ax, ay, az, aw);
}
protected float screenXImpl(float x, float y, float z, float w) {
float ox =
projection.m00*x + projection.m01*y + projection.m02*z + projection.m03*w;
float ow =
projection.m30*x + projection.m31*y + projection.m32*z + projection.m33*w;
if (nonZero(ow)) {
ox /= ow;
}
float sx = width * (1 + ox) / 2.0f;
return sx;
}
Run Code Online (Sandbox Code Playgroud)
对于y和对于z(我不理解z,但让我们忽略它).我认为这可能会对如何反转它提供一些见解.
modelview和projection是一个3d矩阵,代码在这里:https: //github.com/processing/processing/blob/master/core/src/processing/core/PMatrix3D.java 但我想这是非常基本和常见的.
我也曾在加工板上发帖,因为你从来不知道.它解释了我想要的一点点不同. http://forum.processing.org/topic/unscreenx-and-unscreeny
对于描述这篇文章的标签,我没有去具体原因我可以想象一个从未使用过Java但是曾经使用过c ++并且具有矩阵经验的程序员仍然能够提供一个很好的答案.
希望有人能提供帮助.
在进行这项工作之前,您需要了解项目矩阵,而处理无法为您提供这一点。但是,我们可以通过检查三个向量 (1,0,0)、(0,1,0) 和 (0,0,1) 的 screenX/Y/Z 值来自行计算出来。从这些我们可以算出屏幕的平面公式是什么(从技术上讲,屏幕只是一个穿过 3D 空间的裁剪后的平面 2D 表面)。然后,给定“屏幕”表面上的 (x,y) 坐标和预定z值,我们可以找到穿过屏幕平面的法线与 处的平面之间的交点z=...。
然而,这不是您想要做的,因为您可以简单地为您想做的任何事情重置坐标系。用于pushMatrix“保存”当前的 3D 变换,resetMatrix将所有内容设置回“直线”,然后根据世界轴和视图轴对齐的事实绘制球体。然后,当你完成后,调用popMatrix恢复你之前的世界变换并完成。省去执行数学的麻烦 =)
| 归档时间: |
|
| 查看次数: |
926 次 |
| 最近记录: |