传统上,在3D投影中,Y轴是表示"上下"的轴.我学会了用其他引擎来思考它,因为该轴是Z轴.我想知道的是Three.JS中是否有一种方法可以使Z轴成为"上/下"轴.如果是的话,会有什么后果吗?
这是我想要的图表:
在过去的几周里,我一直在尝试学习libGDX库.我发现很难,尤其是我第一次尝试游戏开发时,要理解相机/视口关系系统.我被告知使用的一行代码和API提到的是:
batch.setProjectionMatrix(camera.combined);
Run Code Online (Sandbox Code Playgroud)
尽管进行了4个小时的研究,但我仍然缺乏对此代码功能的完整理解.根据我的基本理解,它"告诉"相机正在寻找的批次.我缺乏理解力令人沮丧和愤怒,如果有人能帮助我,我会很感激.代码片段的另一个问题是我不确定何时需要实现(在render方法中,create方法等).
我试图在R中计算P
任意N x J矩阵的投影矩阵S
:
P = S (S'S) ^ -1 S'
Run Code Online (Sandbox Code Playgroud)
我一直试图用以下功能执行此操作:
P <- function(S){
output <- S %*% solve(t(S) %*% S) %*% t(S)
return(output)
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用它时,我得到的错误看起来像这样:
# Error in solve.default(t(S) %*% S, t(S), tol = 1e-07) :
# system is computationally singular: reciprocal condition number = 2.26005e-28
Run Code Online (Sandbox Code Playgroud)
我认为这是数值下溢和/或不稳定的结果在许多地方一样讨论R-帮助和这里,但我没有足够的经验使用SVD或QR分解来解决这个问题,要不然就把这个现有的代码到行动.我也尝试了建议的代码,即将solve写成一个系统:
output <- S %*% solve (t(S) %*% S, t(S), tol=1e-7)
Run Code Online (Sandbox Code Playgroud)
但它仍然无效.任何建议,将不胜感激.
我很确定我的矩阵应该是可逆的并且没有任何共线性,只是因为我尝试用正交虚拟变量矩阵进行测试,但它仍然不起作用.
另外,我想将它应用于相当大的矩阵,所以我正在寻找一个简洁的通用解决方案.
我有一个投影矩阵,来自增强现实应用程序中的相机校准,只要屏幕宽高比与相机图像宽高比匹配,一切都很好.当相机图像与屏幕边缘不匹配时,您将在跟踪中出现失真.
问题场景:
工作场景:
目标:我想以一般方式处理此屏幕/相机纵横比不匹配.
此问题的存在是因为视图在屏幕的纵横比(iPad为4:3)中规范化了设备坐标,而投影矩阵具有相机图像的纵横比(对于720p为16:9).背景图像需要与投影矩阵匹配或增强现实的幻觉失败,所以如果我想在'fit'和'fill'之间切换,我需要更改投影矩阵以匹配图像大小.
注意:我希望在没有OpenGL特定解决方案的情况下处理这个问题.所以我正在寻找一个涉及操纵投影矩阵的更一般的数学答案.
我尝试使用countNonZero()函数进行水平投影,如下所示.
Mat src = imread(INPUT_FILE, CV_LOAD_IMAGE_COLOR);
Mat binaryImage = src.clone();
cvtColor(src, src, CV_BGR2GRAY);
Mat horizontal = Mat::zeros(1,binaryImage.cols, CV_8UC1);
for (int i = 0; i<binaryImage.cols; i++)
{
Mat roi = binaryImage(Rect(0, 0, 1, binaryImage.rows));
horizontal.at<int>(0,i) = countNonZero(roi);
cout << "Col no:" << i << " >>" << horizontal.at<int>(0, i);
}
Run Code Online (Sandbox Code Playgroud)
但是在调用countonZero()函数时出现错误.错误如下.
OpenCV Error: Assertion failed (src.channels() == 1 && func != 0) in cv::countNo
nZero, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\st
at.cpp, line 549
Run Code Online (Sandbox Code Playgroud)
有人可以指出错误吗?
我无法解决这些问题.首先,在2D游戏中,投影矩阵应设置为正交,左,右,上,下与窗口匹配,对吗?但是当窗口调整大小时,我应该只更改glViewport,而不是投影矩阵吗?我如何保持纵横比?
有人可以解释这两件事的目的,在二维正字游戏中,这样我可以更好地理解它吗?
感觉就像OpenGL在2D设置中做了很多无用的东西.当图像已经存在时,栅格化和计算片段,将顶点坐标转换为NDC仅转换回glViewport已经存在的位置.
另外,传统的免费OpenGL如何制作我们自己的矩阵,而不是我们自己的glViewport计算呢?
谢谢.
所有,
我有一个iphone项目,使用OpenGL-ES为给定的模型视图矩阵和给定的投影矩阵绘制3D模型.我需要用CALayer替换3D模型,所以我将模型视图矩阵的值放入CATransform3D结构并分配给它layer.transform
.它运作良好,图层可见并按预期在屏幕上移动,但过了一段时间后我意识到我的图层行为不够精确,我应该考虑投影矩阵.然后出现了一个问题:当我简单地连接两个矩阵时,我的图层看起来很奇怪(它非常小,大约2个像素,而它应该是大约300个,因为它距离很远)或根本不可见.我该如何解决?
这是一段代码:
- (void)adjustImageObjectWithUserInfo:(NSDictionary *)userInfo
{
NSNumber *objectID = [userInfo objectForKey:kObjectIDKey];
CALayer *layer = [self.imageLayers objectForKey:objectID];
if (!layer) { return; }
CATransform3D transform = CATransform3DIdentity;
NSArray *modelViewMatrix = [userInfo objectForKey:kModelViewMatrixKey];
// Get raw model view matrix;
CGFloat *p = (CGFloat *)&transform;
for (int i = 0; i < 16; ++i)
{
*p = [[modelViewMatrix objectAtIndex:i] floatValue];
++p;
}
// Rotate around +z for Pi/2
transform = CATransform3DConcat(transform, CATransform3DMakeRotation(M_PI_2, 0, 0, 1));
// Project with projection matrix
transform …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个跟踪器(手动跟踪个人项目),因此我需要使用Plucker坐标将2d点反投影到3d线.(如光线追踪)
作为输入,我有一个点的2d坐标和投影矩阵.
关于plucker坐标的网上信息概述了它们有用的原因,但是没有纸质分析地描述上述过程.(他们只是提到他们回到投影线,没有任何进一步的描述)
有人可以指出我正确的方向吗?
我有一个图像和几个已知点及其到图像平面的投影。(每个 3d 点都有到 2d 的投影)。我的目标是找到 4x4 矩阵,以便轻松计算任何 3d 点到图像平面的投影。我尝试使用本主题中的蒙特卡罗方法:如何将 2D 点反向投影为 3D? 但结果矩阵适用于 oXY 平面,不适用于 Z 坐标(非零 Z 的点投影不正确)。我还使用了 OpenCV.CalibrateCamera 方法。我得到了旋转矩阵、相机矩阵和平移向量,但它对于非零 Z 点也不好。另外,我对3个矩阵不感兴趣,我只想得到一个4x4的矩阵用于投影和非投影点。
我很确定我的问题已经解决,但不知道如何解决。