我想从相机的方向照亮顶点水平的平坦表面。我希望旋转视图时灯光不会改变,但当我稍微移开视线时灯光最亮。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
简单地说,我只是想表明一个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#的新手,实际上我正在创建一个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!?我不明白......
提前致谢.
编辑
哦,还有一件事,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) 我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用 OpenCV Pose Estimator 和设备本身的固有相机参数,我能够生成一个非常好的 OpenCV 相机矩阵和 OpenGL 透视矩阵,从而产生合理的结果。
然而,我的解决方案以及我在该论坛和其他 Internet 位置上检查过的所有类似解决方案,只是对透视矩阵近端和远端参数使用一些有些任意的值(通常为 1.0 和 100)。
然而,虽然如果感兴趣的对象不是太近,这通常是可以的,但当对象靠近视点时,它会变得更加不准确并且成为失真的来源。
实际上,随着这两个参数(近、远)的调整,透视的消失点发生变化。
有谁有更合理的方法来从可用数据中推导出近参数和远参数?
opengl opencv perspectivecamera camera-calibration pose-estimation
在相机成像中,点坐标有几个术语.
世界坐标:物理单位中的[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
我在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) 我尝试在脚本中在透视相机和正交相机之间切换。我希望物体处于一定深度以保持其投影尺寸。我放弃了去理解几何......
您能否提供一些简单教程的链接,这对我来说太复杂了。
对于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
我正在用 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)