标签: perspectivecamera

模型视图投影中的第四行是查看位置吗?

我想从相机的方向照亮顶点水平的平坦表面。我希望旋转视图时灯光不会改变,但当我稍微移开视线时灯光最亮。mvp[3] 不是像我想象的那样是相机坐标吗?

#version 450
in vec3 vertex;
uniform mat4 mvp;
out vec4 color;

void main()
{
    gl_Position =  mvp * vec4(vertex,1.);
    vec3 n = vec3(0.,0.,1.);
    vec3 v = normalize( vec3(mvp[3])-vertex );
    //I tried the other direction in the mat4
    //vec3(mvp[0][3],mvp[1][3],mvp[2][3]);

    color = vec4( dot(v,n) );
}
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl perspectivecamera coordinate-transformation

2
推荐指数
1
解决办法
1164
查看次数

使用opengl显示3D点

简单地说,我只是想表明一个3d观点,但没有任何表现!

如何展示?下面的代码有什么问题,有人可以帮忙吗?

在里面:

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(-200, 0.0, -50, 100, 70, 300);
}
Run Code Online (Sandbox Code Playgroud)

展示:

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glPointSize(2);
    glBegin(GL_POINTS);
    glVertex3f(-120.0, 25.0, 0.0);
    glEnd();

    glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)

重塑:

  void reshape(int w, int h)
    {
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(65.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(-120, 25, 0.0, -120, 25, 150, 0, 1, 0);
    }
Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d glut perspectivecamera

2
推荐指数
1
解决办法
1832
查看次数

无法在C#中访问超类的属性

我是C#的新手,实际上我正在创建一个PerspectiveCamera的子类

class VCamera : PerspectiveCamera
{

    private double m_AngleRadianX;
    private double m_AngleRadianZ;

    public VCamera()
    {
        m_AngleRadianX = 0.0;
        m_AngleRadianZ = 0.0;
        LookDirection = new Vector3D();          
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法访问LookDirection,它是PerspectiveCamera的公共属性. http://msdn.microsoft.com/en-US/library/system.windows.media.media3d.perspectivecamera.aspx

是因为LookDirection继承自ProjectionCamera!?我不明白......

提前致谢.

c# subclass perspectivecamera

1
推荐指数
1
解决办法
488
查看次数

WPF,3D相机将无法正确旋转

编辑

哦,还有一件事,longtitute很好,但是当大约达到1.57时,它会翻转...

在此输入图像描述

编辑工作!

哦,只有旋转速度在转一圈时才会开始增加.猜测必须在每次旋转后重置tempMouse.

    private void mouseWheel(object sender, MouseWheelEventArgs  e)
    {
        if (e.Delta < 0) { distance = distance - 0.5; } else { distance = distance + 0.5; }

        Point3D position = new Point3D
            (
                Math.Cos(longitude) * Math.Cos(latitude) * distance,
                Math.Sin(latitude) * distance,
                Math.Sin(longitude) * Math.Cos(latitude) * distance
            );

       _perspectiveCamera.Position = position;
    }


    private void mouseMove(object sender, MouseEventArgs e)
    {

        if ( e.LeftButton == MouseButtonState.Pressed )
        {
            if (isLeftDown == false)
            {
                isLeftDown = true;
                tempMouseX = this.PointToScreen(Mouse.GetPosition(this)).X;
                tempMouseY …
Run Code Online (Sandbox Code Playgroud)

.net wpf perspectivecamera

1
推荐指数
1
解决办法
640
查看次数

OpenGL 透视矩阵的固有相机参数:近远参数?

我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用 OpenCV Pose Estimator 和设备本身的固有相机参数,我能够生成一个非常好的 OpenCV 相机矩阵和 OpenGL 透视矩阵,从而产生合理的结果。

然而,我的解决方案以及我在该论坛和其他 Internet 位置上检查过的所有类似解决方案,只是对透视矩阵近端和远端参数使用一些有些任意的值(通常为 1.0 和 100)。

然而,虽然如果感兴趣的对象不是太近,这通常是可以的,但当对象靠近视点时,它会变得更加不准确并且成为失真的来源。

实际上,随着这两个参数(近、远)的调整,透视的消失点发生变化。

有谁有更合理的方法来从可用数据中推导出近参数和远参数?

opengl opencv perspectivecamera camera-calibration pose-estimation

1
推荐指数
1
解决办法
3877
查看次数

均匀坐标是通过在摄像机成像中附加1的图像坐标来表示的

在相机成像中,点坐标有几个术语.

世界坐标:物理单位中的[X,Y,Z]

图像坐标:像素中的[u,v].

通过附加1,这些坐标是否成为齐次坐标?有时在书籍和纸张中它由[x,yw]表示.什么时候使用w?什么时候使用1?

在函数initUndistortRectifyMap中,http: //docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#void%20initUndistortRectifyMap(InputArray%20cameraMatrix,%20InputArray%20distCoeffs,%20InputArray%20R,%20InputArray%20newCameraMatrix ,, %20Size%20size,%20int%20m1type,%20OutputArray%20map1,%20OutputArray%20map2)

应用以下过程

在此输入图像描述

坐标[xy 1]有一个术语吗?我不明白为什么R可以应用于[xy 1]?在我看来,R是3D的转变.[xy 1]是一个2d点还是一个3d点?

[uv] - > [xy] - > [xy 1] - > [XYW] - > [x'y']根据上述链处理坐标.它背后的原理是什么?

opencv imaging perspectivecamera projective-geometry camera-calibration

1
推荐指数
1
解决办法
928
查看次数

透视投影和视图矩阵:OpenGL中的深度缓冲和三角面朝向都相反

我在OpenGL中遇到麻烦.应该更远的物体被拉得更近等等,正面朝向的三角形被剔除而不是朝后的三角形.它们以正确的方向绘制,因为它是我之前使用过的包.我确信它与我的投影或veiwModel矩阵有关.虽然我看不出有什么问题!

AV4X4FLOAT formProjMatrix(float FOVangle,float aspect,float nearz,float farz)
{
    AV4X4FLOAT A;

    A.m[0] = 1/(aspect*tanf(FOVangle/2));
    A.m[5] = 1/tanf(FOVangle/2);
    A.m[10] = farz/(farz-nearz);
    A.m[11] = -nearz*farz/(farz-nearz);
    A.m[14] = 1;
    return A;
}
Run Code Online (Sandbox Code Playgroud)

AV4X4FLOAT formViewModelMatrix(AV4FLOAT pos,AV4FLOAT target,AV4FLOAT up)
{ 
    AV4X4FLOAT M;
    AV4X4FLOAT R;
    AV4FLOAT u;
    AV4FLOAT v;
    AV4FLOAT W;

    W.x = -pos.x + target.x;
    W.y = -pos.y + target.y;
    W.z = -pos.z + target.z;

    W.w = 0;
    W.normalize();

    u.x = up.y*W.z-W.y*up.z;
    u.y = -up.x*W.z+W.x*up.z;
    u.z = up.x*W.y-W.x*up.y;
    u.w = 0;
    u.normalize();

    v.x = W.y*u.z-u.y*W.z;
    v.y …
Run Code Online (Sandbox Code Playgroud)

c++ opengl perspectivecamera

1
推荐指数
1
解决办法
586
查看次数

如何在透视相机和正交相机之间切换并保持所需对象的大小

我尝试在脚本中在透视相机和正交相机之间切换。我希望物体处于一定深度以保持其投影尺寸。我放弃了去理解几何......

您能否提供一些简单教程的链接,对我来说太复杂了。

对于position.z==0我的对象有:

perspCamera = new THREE.PerspectiveCamera(45, W / H, 1, 1000);
perspCamera.position.z = 100;

var S=Math.tan((45/180)*Math.PI)*100;
orthoCamera = new THREE.OrthographicCamera( -S, S, S, -S, 1, 1000 );
Run Code Online (Sandbox Code Playgroud)

这是不正确的。

更新:

我明白了,我将用 codepen 链接发布答案

javascript orthographic perspectivecamera coordinate-transformation three.js

1
推荐指数
1
解决办法
2796
查看次数

如何在透视投影场景中使用面法线进行背面剔除

我正在用 C++ 编写低级 2D/3D 渲染引擎作为 MCU 平台显示驱动程序的一部分,但我在 3D 透视投影和面部剔除方面遇到了困难。

假设我的 3D 引擎正在使用M,V,P矩阵(与 OpenGL 固定管道中的模型、视图和投影矩阵相同)。

这个想法是将光栅化的面法线转换为视图局部坐标(使用MV)并测试与视图方向相对应的坐标符号。对于相机视图方向和法线本身之间的点积也可以完成同样的操作。并根据标志进行光栅化或跳过面。这对于平行光线投影非常有效……但是对于透视投影,这会导致误报(您可以“视觉上”看到倾斜到某个角度的面孔)。

对于填充的表面,这只会影响性能,因为深度缓冲区可以修复伪像,因此渲染看起来应该是这样。然而线框是一个问题:

误报

补救措施是通过变换面的顶点MVP并进行透视划分。然后根据结果重新计算法线并将其用于面部剔除:

透视后重新计算法线

然而,在像 MCU 这样的慢速平台上,还有更多的操作可能会造成性能问题。所以我的问题是:

如果可能如何安全地使用面法线进行背面剔除?

我尝试通过透视划分来变换面中心及其在法线方向上的小位移MVP,然后从这两个点重新计算法线,从而局部变换法线。仍然是直接使用正常操作的两倍,但好于 3 倍。然而结果不正确(看起来与直接使用正常几乎相同)。

我正在考虑以某种方式计算给定投影/位置的倾斜角度并测试:

dot(normal,view_direction) >= acos(min_tilt_angle_threshold)
Run Code Online (Sandbox Code Playgroud)

然而,不确定如何计算倾斜角度,也不知道它是否是一个安全的假设,也不知道是否必须应用 x,y 方向的比例,因为投影具有不平凡的长宽比,因为通常屏幕分辨率是矩形。

我当前的测试渲染代码如下所示:

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef _mesh_h
#define _mesh_h
//---------------------------------------------------------------------------
#include "vecmath.h"
//---------------------------------------------------------------------------
int view_flags;
float view_mv[16],view_p[16],view_mvp[16],view_ofs[3],view_sc[3];
static volatile float angx=0.0,angy=0.0,angz=5.0*deg;
//---------------------------------------------------------------------------
void obj2mv(float *xyz,const float *dir,float w)
    {
    // apply MV
    mat4_mul_vec3(xyz,view_mv,dir,w);
    }
//---------------------------------------------------------------------------
void obj2mvp(float *p,const float *pos)
    {
    float …
Run Code Online (Sandbox Code Playgroud)

c++ math 3d graphics perspectivecamera

1
推荐指数
1
解决办法
1009
查看次数