- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个代码:
/*
* This is a simple program that computes FPS
* by means of a circular buffer
*/
#include <GL/glut.h>
//#include <numeric>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
// Number of elements in the circular buffer
#define NELS 10
// Number of lines
#define NLINES 10000
// circular buffer used to compute frame rate
float circularBuffer[NELS];
int firstInd = 0, nEls = 0;
// function to get the number of elapsed ticks
uint32_t getTick()
{
struct timespec ts;
unsigned theTick = 0U;
clock_gettime( CLOCK_REALTIME, &ts );
theTick = ts.tv_nsec / 1000000;
theTick += ts.tv_sec * 1000;
return theTick;
}
// Function to compute real modulus and NOT remained as % does
inline int modulo(int a, int b) {
const int result = a % b;
return result >= 0 ? result : result + b;
}
// Compute sum of the elements in the circular buffer
float sumCircularBuffer()
{
int ind;
float sum = 0;
if (nEls > 0) {
for (ind=1; ind<=nEls; ind++) {
sum = sum + circularBuffer[modulo(firstInd-ind, NELS)];
}
}
return sum;
}
// accumulate buffer and update window title
void computeAndShowFrameRate(void)
{
static float lastTime = 0.0f;
static unsigned int frameCount = 0;
char windowTitle[100];
float sumFPS;
float currentTime = (float)getTick() * 0.001f;
// Initialize lastTime to the current time
if (lastTime == 0) {
lastTime = currentTime;
}
// increase frame count
frameCount++;
if (currentTime - lastTime > 1.0f) {
// insert the current fps in the circular buffer
circularBuffer[firstInd] = ((float)frameCount) / (currentTime - lastTime);
// update variable lastTime
lastTime = currentTime;
//circularBuffer[firstInd] = (float)frameCount;
firstInd = ((firstInd+1)%NELS);
if (nEls < NELS) {
nEls++;
}
frameCount = 0;
// sum elements in circular buffer
sumFPS = sumCircularBuffer();
snprintf(windowTitle, 100, "FPS = %6.2f", sumFPS/nEls);
// update window title
glutSetWindowTitle(windowTitle);
}
}
// display function
void display(void)
{
int currLineInd;
// get current frame rate
computeAndShowFrameRate();
// clear buffer
glClear (GL_COLOR_BUFFER_BIT);
for (currLineInd = 0; currLineInd<NLINES; currLineInd++) {
// draw line
glBegin(GL_LINES);
// random color
glColor3f((float)rand()/RAND_MAX, (float)rand()/RAND_MAX, (float)rand()/RAND_MAX);
// random first point
glVertex2f((float)rand()/RAND_MAX, (float)rand()/RAND_MAX);
// random color
glColor3f((float)rand()/RAND_MAX, (float)rand()/RAND_MAX, (float)rand()/RAND_MAX);
// random second point
glVertex2f((float)rand()/RAND_MAX, (float)rand()/RAND_MAX);
glEnd();
}
glFinish();
glutPostRedisplay();
}
// initialization function
void init (void)
{
// Use current time as seed for random generator
srand(time(0));
// select clearing color
glClearColor (0.0, 0.0, 0.0, 0.0);
// Orthographic projection
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
// Window size and mode
int main(int argc, char** argv)
{
// pass potential input arguments to glutInit
glutInit(&argc, argv);
// set display mode
// GLUT_SINGLE = single buffer window
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (400, 400);
glutInitWindowPosition (100, 100);
glutCreateWindow ("OpenGL Window");
// Call initialization routinesx
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
我必须用 glFrustum 替换 glOrtho 函数并得到相同的结果。
我阅读了关于 khronos 的 opengl 指南并了解 glOrtho 和 glFrustum 之间的区别,但我不知道如何计算参数。
如何计算传递给 glFrustum 函数的参数?
最佳答案
glFrustum()
需要 6 个参数来指定 6 个裁剪平面:left、right、bottom、< strong>top、near 和far 平面。视觉表示是这样的:
将得出的值取决于您的实现和您使用的模型的规模。如上所述,如果投影几何体位于近平面前面或远平面后面,它将被裁剪,因此它不会可见。
要解决此问题,您必须重新计算 glFrustum()
函数的参数(坏主意)或沿 z 轴移动相机/场景。
引用资料:
关于c++ - 我如何计算 glFrustum 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66709363/
根据 MSDN,我们将当前矩阵与透视矩阵相乘。我们在这里谈论什么矩阵?同样来自 MSDN: "The glFrustum function multiplies the current matrix
我正在尝试使用 C++ 和 openGL 创建一个 3D 操作程序。我对 openGL 比较陌生,所以我经常需要查阅文档才能找到正确的函数来完成我想做的事情。我认为我对正交投影和透视投影有很好的理解(
关于使用 glFrustum, glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1, 1, -1, 1, 0.1, 1000.0);
我有这个代码: /* * This is a simple program that computes FPS * by means of a circular buffer */ #inclu
目前我将 glFrustum 设置为 glFrustum(0, 100.0, 0, 100.0, -50, 50); 我的图像是一个矩形立方体,尺寸为:当形状的尺寸小于查看框时,为什么我看不到图像?
我刚开始阅读有关 OpenGL 的主题,特别是关于 Viewing 的内容满足我目前的需求。我正在尝试理解 glFrustum 以了解我在屏幕上绘制的对象的透视投影,据我所知,glFrustum 会使
我正在尝试使用 OpenGL 对场景进行离轴投影,并且我阅读了文档给 Robert Kooima's off-axis projection并且现在对实际必须做的事情有了更好的了解,但仍有一些我在这里
我有一个程序,可以根据用户的位置在屏幕上渲染场景。当用户改变位置时,平截头体改变以提供离轴投影。我想利用该技术在三个不同的显示器上工作,将一个更大的场景拼接在一起,具有以下类型: 想象一下在三个显示器
我使用 OpenGL 绘制了几个二维形状现在我想添加捏/缩放。我的观点是透视图(顶 View )。我假设它是 3D,z 轴 = 0。 现在,我应该如何更改 glfrustum 并在我的 Activit
我正在尝试使用 glFrustum 进行透视投影,据我所知,glFrustum 像 glOrtho 可用于修改我们的映射所需的坐标系到实际屏幕坐标(如 Blue book 中所读)。所以,如果我执行
我的老师说它们可以互换使用来影响投影矩阵。他认为 gluLookAt()之所以优选使用,是因为它“由于能够定义视角而相对简单”。这是真的?我见过同时使用 gluLookAt() 的代码示例和 glFr
我想知道 gluLookAt 和 glFrustum 是否会扭曲渲染的图片。 场景是这样渲染的: 这是呈现它的代码。 InitCamera 被调用一次 并且,据我现在的理解,应该设置一个矩阵,就好像我
我正在调试我想查看深度图像扫描的代码,但我的相机设置不允许我看到扫描。因此,我正在玩弄相机设置。我在 (30,120,800) 处创建了一个巨大的点,我可以使用 gluLookAt 看到它。 glFr
我试图在窗口上画一条线,但它没有用 glFrustum() 显示。我在 glOrtho() 中使用了相同的代码,它确实显示了该行。我还需要设置什么才能让我的线路显示在设置窗口上吗? void init
原始问题/代码 我正在微调 3D 对象的渲染并尝试使用 gluLookAt 实现相机跟随对象,因为对象的中心 y 位置一旦达到其最大高度就会不断增加。下面是我设置 ModelView 和投影矩阵的代码
我正在编写一个太空探索应用程序。我决定以光年为单位,并准确地模拟了恒星之间的距离。经过修补和大量艰巨的工作(主要是学习绳索),我让相机从穿越宇宙的星舰的角度正常工作。 最初我没有注意 gluPersp
我只是使用 LWJGL 3 设置一个简单的渲染器,当它在我的外部显示器上运行时,它看起来像我预期的那样,但是当在我的 Macbook 上调整它的大小时,它会缩小视口(viewport)。然后,如果我移
我正在完成一项绘制线框 GLUT 标准对象的任务。这看起来很简单,但我们被告知我们不能使用 gluAtLook()、glOrtho()、glFrustrum,但我们必须使用 glTranslate()
我一直在使用 OpenGL 3.0,让我困惑的一件事是新的 OpenGL 如何处理视锥体。如果您应该为透视计算创建自己的矩阵,那么如何向 OpenGL 指定 zFar 和 zNear 平面距离是多少?
概述: 我正在尝试创建一个类似于此的 3D 应用程序: www.youtube.com/watch?v=h9kPI7_vhAU. 我正在使用 OpenCV2.2、Python2.7 和 pyOpenG
我是一名优秀的程序员,十分优秀!