- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这样设置我的场景(Android 应用程序,OpenGL ES):
GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f);
// ...
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f);
// Scene scaled down because object positions are in [-10000..10000] for x & y
gl.glScalef(0.001f, 0.001f, 1.0f);
场景渲染得很好,它包含 z=-10 处的四边形和一个 z=-30 处的巨大背景四边形。我现在正在尝试实现光线拾取,就像这样(取自 this thread :
public float[] unproject(float rx, float ry, float rz) {
float[] xyzw = {0, 0, 0, 0};
int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0);
xyzw[0] /= xyzw[3];
xyzw[1] /= xyzw[3];
xyzw[2] /= xyzw[3];
xyzw[3] = 1;
return xyzw;
}
然后以这种方式测试屏幕上的点击:
unproject(tapX, mDisplayHeight - tapY, BACKGROUND_Z);
预期行为:返回的 X、Y 坐标类似于深度 = -30 (BACKGROUND_Z) 处的点击点
实际作用:在屏幕中心点击时返回正确的 X、Y 坐标;但是屏幕中心和点击点之间的距离没有被正确解释——它似乎被某种因素缩小了。例如。点击屏幕中心给出 [0,0],点击屏幕左边缘应该给出 ~[-3600,0],但给出 [-1.13,0]。平移 View ,使之前触摸的点位于屏幕中心,这会给出 ~[-3600,0],这是应该的。
这会不会是因为场景缩放了 0.001?我已经测试了各种配置(在 gluLookAt 之前移动缩放比例,或者完全删除它),但问题仍然存在 :(
屏幕左边缘触摸的示例数据输出:
传递给 unproject() 的接触点:
x=3, y = 554 (0,0 at bottom left; w=720, h=1280)
投影矩阵:
[2.8482616, 0.0, 0.0, 0.0,
0.0, 1.7320509, 0.0, 0.0,
0.0, 0.0, -1.0001999, -1.0,
0.0, 0.0, -0.20001999, 0.0]
模型矩阵:
[0.0010, 0.0, 0.0, 0.0,
0.0, 0.0010, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 1.0, 1.0]
unproject() 输出:
[-1.1232367, -0.11801138, -1.0032262, 1.0]
我想到的是返回的 z 值似乎是错误的 - 传递给 unproject() 的 z 值是 -30(如上所述)。
最佳答案
让我们看看——我无法重现您获得的值,但我认为这无关紧要。
您不得使用 [-1;+1]
之外的 z 值调用 unproject
。 unproject
必须做的第一件事是反转窗口变换,然后,坐标必须在 NDC 空间中。在 OpenGL 中,这是立方体 [-1;+1]^3
(songho 包含一些漂亮的图形)。使用-30
调用unproject
意味着该点必须在近平面之前。用 z=-1.0f
调用它会产生近平面,而 z=+1.0f
会产生远平面。
如何选择 z
s.t.在所有矩阵求逆之后,z=-30
成立——我不知道。
关于android - OpenGL : gluUnProject returns wrong coordinates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906759/
询问 unrelated question我有这样的代码: public boolean equals(Object obj) { if (this == obj) retur
在我之前的一个问题中 js: Multiple return in Ternary Operator我询问了有关使用三元运算符返回多个参数的问题。但是现在参数IsActveUser boolean(t
假设我有一个带有 return 的 if 语句。从效率的角度来看,我应该使用 if(A > B): return A+1 return A-1 或 if(A > B): return
例如考虑以下代码: int main(int argc,char *argv[]) { int *p,*q; p = (int *)malloc(sizeof(int)*10); q
PyCharm 对这段代码发出警告,说最后一个返回是不可访问的: def foo(): with open(...): return 1 return 0 如果 ope
我想实现这样的目标: 如果在返回 Json 的方法中抛出异常,则返回 new Json(new { success = false, error = "unknown"}); 但如果方法返回 View
它是多余的,但我正在学习 JS,我想知道它是如何工作的。 直接从模块返回函数 let func1 = function () { let test = function () {
我不明白我应该使用什么。我有两页 - intro.jsp(1) 和 booksList.jsp(2)。我为每一页创建了一个 Controller 类。第一页有打开第二页的按钮:
我最近在 Joomla 组件(Kunena,更准确地说是 Kunena)中看到这段代码,那么使用 $this->return VS 简单的 return 语句有什么区别. 我已经用谷歌搜索了代码,但没
我的类实现了 IEnumerable。并且可以编译这两种方式来编写 GetEnumerator 方法: public IEnumerator GetEnumerator() { yield r
我只是在编码,我想到了一个简单的想法(显然是问题),如果我有一个像这样的函数: int fun1(int p){ return(p); } 我有一个这样的函数: int fun1(int p){
这个问题在这里已经有了答案: What does the comma operator do in JavaScript? (5 个答案) 关闭 9 年前。 function makeArray
假设我写了一个 for 循环,它将输出所有数字 1 到 x: x=4 for number in xrange(1,x+1): print number, #Output: 1 2 3 4 现
我最近在这个 Apache Axis tutorial example. 中看到了下面的一段代码 int main() { int status = AXIS2_SUCCESS; ax
function a(){ return{ bb:"a" } } and function a(){ return { bb:"a" } } 这两个代码有什么区别吗,如果有请
function a() { return 1; } function b() { return(1); } 我在 Chrome 的控制台中测试了上面的代码,都返回了 1。 function c()
考虑这三个函数: def my_func1(): print "Hello World" return None def my_func2(): print "Hello World"
这可能是一个愚蠢的问题,但我正在努力,如果有一种简明的方法来测试函数的返回结果,如果它不满足条件,则返回该值(即,传递它)。。现在来回答一个可能的问题,是的,我正在寻找的类似于例外提供的东西。然而,作
我正在测试一个函数,并尝试使用 return 来做什么,并在 PowerShell 5.1 和 PwSh 7.1 中偶然发现了一个奇怪的问题,即 return cmdlet似乎不适合在团体中工作: P
这个问题已经有答案了: Return in generator together with yield (2 个回答) Why can't I use yield with return? (5 个回
我是一名优秀的程序员,十分优秀!