我目前正在研究GLSL中的一些光线投射,效果很好.无论如何我现在想从正交投影到透视投影,但我不知道如何正确地做到这一点.关于如何使用投影矩阵与光线投射有任何良好的联系吗?我甚至不确定我应该将矩阵应用到(以某种方式对射线方向?).现在我这样做(伪代码):
vec3 rayDir = (0.0, 0.0, -1.0); //down the negative -z axis in parallel;
Run Code Online (Sandbox Code Playgroud)
但是现在我想使用一个类似于gluPerspective函数的projMatrix,这样我就可以简单地定义宽高比,fov以及近和远平面.所以基本上,任何人都可以为我提供一大堆代码来设置类似的proj矩阵gluProjection吗?其次告诉我将它与rayDirection相乘是否正确?
我正在显示一个包含一些立方体的场景.相机使用persective.一切都很好,但我希望垂直线是平行的(两点透视:http://en.wikipedia.org/wiki/Perspective_ ( graphical)# Two-point_perspective).
从正面查看立方体时:
我想要的是:
+-----+
| |
| |
+-----+
Run Code Online (Sandbox Code Playgroud)
我得到的(夸大):
+--------+
\ /
\ /
+--+
Run Code Online (Sandbox Code Playgroud)
我试图摆弄相机的FOV,但无济于事.
我到目前为止的尝试:
Camera = SceneManager.CreateCamera(CameraName);
float q = 45;
float d = 5000f;
Matrix4 m = new Matrix4(
1, 0, 0, (float)(Math.Sin(q)/d),
0, 1, 0, 0,
0, 0, 1, (float)(Math.Cos(q)/d),
0, 0, 0, 0
);
Camera.SetCustomProjectionMatrix(true, m);
Run Code Online (Sandbox Code Playgroud) 我有一个从sourceImage中提取的四个角:
src_vertices[0] = corners[upperLeft];
src_vertices[1] = corners[upperRight];
src_vertices[2] = corners[downLeft];
src_vertices[3] = corners[downRight];
Run Code Online (Sandbox Code Playgroud)
这四个角像这样扭曲到destinationImage:
dst_vertices[0] = Point(0,0);
dst_vertices[1] = Point(width, 0);
dst_vertices[2] = Point(0, height);
dst_vertices[3] = Point(width, height);
Mat warpPerspectiveMatrix = getPerspectiveTransform(src_vertices, dst_vertices);
cv::Size size_d = Size(width, height);
cv::Mat DestinationImage(width,height,CV_8UC3);
warpPerspective(sourceImage, destinationImage, warpPerspectiveMatrix, size_d, INTER_LINEAR, BORDER_CONSTANT);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:
我有一个点p(x,y)取自destinationImage如何在原始sourceImage中检索此点的坐标
换句话说,我想使用warpPerspectiveMatrix来完成getPerspectiveTransform的相反工作
opencv image-processing perspectivecamera distortion 3d-reconstruction
我通过使用getHomography和warpPerspective将图像从前视角更改为出价视图.
它的工作原理是图像扭曲到所需的视角,但裁剪关闭.它将扭曲的图像移动到图像框之外.我假设原因是因为操作导致负坐标.
我已经手动计算了翻译矩阵的计算点,而不是使用任何opencv:s函数来计算,因为棋盘函数未能检测到正确的点.
我想这可以通过对转换矩阵进行其他更改来解决.但那怎么办?另外,有没有办法确保变换后的图像沿x轴居中,然后将y轴调整到所需位置?
现在完成工作的代码段:
cv::Mat image; // image is loaded with the original image
cv::Mat warpPers; // The container for the resulting image
cv::Mat H;
std::vector<cv::Point2f> src;
std::vector<cv::Point2f> dst;
// In reality several more points.
src.push_back(cv::Point2f(264,301));
src.push_back(cv::Point2f(434,301));
src.push_back(cv::Point2f(243,356));
src.push_back(cv::Point2f(476,356));
dst.push_back(cv::Point2f(243,123));
dst.push_back(cv::Point2f(476,123));
dst.push_back(cv::Point2f(243,356));
dst.push_back(cv::Point2f(476,356));
H = cv::findHomography(src, dst, CV_RANSAC);
cv::warpPerspective(image,
newPers,
H,
cv::Size(3000,3000),
cv::INTER_NEAREST | CV_WARP_FILL_OUTLIERS
);
cv::namedWindow("Warped persp", cv::WINDOW_AUTOSIZE );
cv::imshow( "Warped persp", newPers);
Run Code Online (Sandbox Code Playgroud) 我已经在opengl中直接绘制到同质的剪辑空间(2x2x2立方体,以0,0,0为中心),并且我意识到透视变换矩阵将所有几何体从一个右 - parallelipid(视图空间)转换为另一个-parallelipid(同质剪辑空间).
所以,为什么每个opengl文章都使用非右平行平截头体来说明投影是如何工作的呢?据我所知,透视变换矩阵将导致所有内容都被一个术语缩放,该术语包含与相机的距离和相机与飞机的距离...是传统的截头图,试图解释这一点?或者我们是否真的在视角转换的某个时刻进入了一些扭曲的空间?如果是这样的话,我们怎么会在最后一个回到右边的parallelipid(同质的剪辑空间)?
我想知道是否gluLookAt与glFrustum扭曲渲染图片一起.
这是渲染场景的方式:

这是渲染它的代码.
InitCamera被称为一次,应该,正如我现在所理解的那样,设置一个矩阵,就好像我从原点前面的2个单位和原点前面的3个单位看.也glFrustum用于创建透视图.
void InitCamera() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (
0, 2 , 3,
0, 0 , 0,
0, 1 , - 0
);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum (- 1, 1,
- 1, 1,
1,1000.0);
glMatrixMode(GL_MODELVIEW);
}
Run Code Online (Sandbox Code Playgroud)
然后TheScene是实际描绘的图片:
void TheScene() {
glClear(
GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT
);
glMatrixMode(GL_MODELVIEW);
// Draw red circle around origin and radius 2 units:
glColor3d(1,0,0);
glBegin(GL_LINE_LOOP);
for (double i = 0; i<=2 * M_PI; i+=M_PI / …Run Code Online (Sandbox Code Playgroud) 我想测量两点之间的实际距离,就像路上有一辆车在我面前,我和车辆之间的距离是多少?
我继续这样做:
1)找到透视变换以获得顶视图.
2)然后试图找到距离.
问题是我无法获得正确的顶视图.
如果有任何替代方式请告诉.
我的目标是渲染 collada 对象并将其完美地放置在带有此对象的图像上。

假设我有在 3ds max 中由 v-ray 渲染器渲染的图像(绿色一个)和我使用透视相机(红色一个)由三个 js 渲染的 collada 对象。
问题是渲染对象的透视失真比图像更大。
我看到THREE.PerspectiveCamera了focus,似乎像什么我要找的财产。但是当我改变它时,什么也没有发生。
THREEJS 文档说:
。重点
用于立体视觉和景深效果的物距。除非使用 StereoCamera,否则此参数不会影响投影矩阵。
但是我在三个 js 文档中没有找到有关 StereoCamera 的任何信息。
有没有人可以帮我解决这个问题?
我编写了一个示例应用程序,它允许 Android 用户拍照并将视图中的文本内容作为图像的叠加层并保存到图库相册中:
我想要的是在加入两个图像之前转换文本位图。具体来说,我想使文本曲线在两侧向上(模拟环绕圆柱体),并使其顶部比底部大(模拟自上而下的透视),如下所示:
无需解释相机图像即可确定曲率或透视变化量。问题是如何操作位图以便可以进行两个转换。
这是我用来将未转换的文本放入相机图像和图库的代码:
private void combinePictureWithText(String fileName) {
Log.v(TAG, "combinePictureWithText");
int targetW = getWindowManager().getDefaultDisplay().getWidth();
int targetH = getWindowManager().getDefaultDisplay().getHeight();
/* Get the size of the image */
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
/* Figure out which way needs to be reduced less */
int scaleFactor = 1;
if ((targetW > 0) || (targetH > 0)) {
scaleFactor = Math.min(photoW/targetW, photoH/targetH);
}
Log.v(TAG, "Scale Factor: " …Run Code Online (Sandbox Code Playgroud) 3d ×3
opencv ×3
opengl ×3
glsl ×2
android ×1
bitmap ×1
c ×1
c++ ×1
distortion ×1
geometry ×1
javascript ×1
math ×1
ogre ×1
opengl-es ×1
perspective ×1
raytracing ×1
three.js ×1