- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我只想要像这个视频这样的东西:https://youtu.be/dGWtdYlryQQ它显示了如何在 OpenGL 中使用 glTranslate
、glRotate
、gluOrtho2d
,但它没有指导我任何事情
在我的例子中,我画了一个菱形而不是三角形,这是我的条件
条件:
这是我的代码:
#include <stdlib.h>
#include <windows.h>
#include <GL/glut.h>
#include <iostream>
using namespace std;
float angle = 0;
float t,s=0.5,m=0;
void myinit(void){
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}
void keyboard(unsigned char key, int x, int y){
if(key==27)
{
exit(0);
}else if(key == 82 || key == 114){
angle-=0.1;
glRotatef(angle,0,0,1);
glutPostRedisplay();
}else if(key == 84 || key == 116 )
{
t+=0.01;
glTranslatef(t,0,0);
glutPostRedisplay();
}else if(key == 43){
s+=0.01;
// m-=0.1;
// glTranslatef(m,m,0.0);
glScalef(s,s,0);
glutPostRedisplay();
}
(void)(x);
(void)(y);
}
void hut(void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.5,0.4,0.0);
glVertex3f(0.42,0.5,0.0); // GREEN
glVertex3f(0.44,0.5,0.0);
glColor3f(1.5,1.0,0.0);
glVertex3f(0.46,0.5,0.0);
glColor3f(0.25,0.0,0.0);
glVertex3f(0.57,0.5,0.0);
glEnd();
glFlush();
glColor3f(1.5,1.0,0.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.44,0.55,0.0);
glVertex3f(0.42,0.5,0.0);
glVertex3f(0.46,0.5,0.0);
glColor3f(0.25,0.0,0.0);
glVertex3f(0.48,0.55,0.0);
glEnd();
glColor3f(1.5,1.0,0.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.48,0.55,0.0);
glVertex3f(0.46,0.5,0.0);
glVertex3f(0.50,0.5,0.0);
glColor3f(0.25,0.0,0.0);
glVertex3f(0.52,0.55,0.0);
glEnd();
glColor3f(1.5,1.0,0.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.52,0.55,0.0);
glVertex3f(0.50,0.5,0.0);
glVertex3f(0.54,0.5,0.0);
glColor3f(0.25,0.0,0.0);
glVertex3f(0.56,0.55,0.0);
glEnd();
glColor3f(1.5,1.0,0.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.56,0.55,0.0);
glVertex3f(0.54,0.5,0.0);
glVertex3f(0.57,0.5,0.0);
glEnd();
glFlush();
}
int main(int argc,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("Polygon with viewport");
myinit();
glutDisplayFunc(hut);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
这是我的输出:https://drive.google.com/file/d/14HHRiCbOHK9ZSZtDOqSl4GP4aSy7UQLh/view?usp=sharing它与此不相似 https://youtu.be/dGWtdYlryQQ
最佳答案
矩阵栈上的操作是相互依存的。每个操作的引用系统是当前转换。
请参阅 glTranslate
的文档:
glTranslate
produces a translation byx y z
. The current matrix (seeglMatrixMode
) is multiplied by this translation matrix, with the product replacing the current matrix, [...]
并查看 glRotate
的文档:
glRotate
produces a rotation of angle degrees around the vectorx y z
. The current matrix (seeglMatrixMode
) is multiplied by a rotation matrix with the product replacing the current matrix.
这意味着 glRotate
围绕当前本地系统的原点进行旋转。
虽然 glRotatetf
后跟 glTranslatef
结果:
glTranslatef
后跟 glRotatef
结果:
glTranslatef(-0.5f, -0.5f, 0.0f);
然后你可以旋转它:
glRotatef(angle, 0.0f, 0.0f, 1.0f);
并将其移回:
glTranslatef(0.5f, 0.5f, 0.0f);
请注意,关于 Fixed Function Pipeline stack 你必须以相反的顺序“推”这个操作。此外,您应该使用 GL_MODELVIEW
矩阵堆栈。 (参见 glMatrixMode
。)
从函数 keyboard
中删除所有矩阵运算,并将以下内容添加到函数 hut
:
void hut(void)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(t, 0.0f, 0.0f);
glTranslatef(0.5f, 0.5f, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glScalef(s, s, 0.0f);
glTranslatef(-0.5f, -0.5f, 0.0f);
.....
float w = 640.0f;
float h = 480.0f;
glOrtho(0.0,w/h,0.0,1.0,-1.0,1.0);
关于c - 如何在 openGL 中使用 glTranslatef、glScalef、glRotatef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48236120/
我使用 glScalef() 来放大我的程序,现在当我用代码将它恢复到原始大小时: glScalef(1.0f/ZOOM, 1.0f/ZOOM, 1); 它在高变焦下效果不佳......(可能是因为丢
大家好,我正在开发一款通过 C++ 和 OpenGL 创建的游戏。我有一个用作主角的动画 Sprite 。当你按“a”键时,他会向后跑,当你按“d”键时,他会向前跑。当他向后跑时,我正在使用 glSc
我使用点 Sprite 来显示数万个点,每个点都有不同的大小。它运行良好,看起来很棒并且速度相当快。我使用的是 VBO,其中包含坐标和大小(每点 4 个 float )。 这是我的显示代码 glEna
glScalef(0.5f, 0.5f, 0); // do some things glScalef(2.0f, 2.0f, 0); 或者.. glPushMatrix(); glScalef(0.
glScalef(0.5f, 0.5f, 0); // do some things glScalef(2.0f, 2.0f, 0); 或者.. glPushMatrix(); glScalef(0.
我有一个简单的问题。我正在使用 FTGL 库在我的游戏应用程序中绘制我的 PixmapFont。我的问题是 - 是否可以使用 glScalef() 来缩放光栅字体?据我了解,如果我必须使用 glRas
我正在尝试在我拥有的 OpenGL 应用程序中实现平移和捏合缩放功能。我能够使用简单的 glTranslatef 相对轻松地实现平移功能,但使用 glScalef 函数则困难得多。我有三个类,一个用于
我有一个程序,根据 GL.GL_VERTEX_ARRAY 集绘制 3D 形状,最后在 display() 方法中绘制 - public void display(GLAutoDrawable draw
所以,今晚我将学习 OpenGL ES,并通过一些示例代码来熟悉它。我目前正在绘制一个立方体,并遇到了两种做(看似)相同事情的方法: 方法#1(更详细) CATransform3D currentCa
我无法理解 Write 函数中发生了什么。请解释一下如何计算Write 函数的参数值。我了解到 gl 坐标系值介于 -1 到 +1 之间。但是这个程序运行良好。怎么可能? void Write(dou
我只想要像这个视频这样的东西:https://youtu.be/dGWtdYlryQQ它显示了如何在 OpenGL 中使用 glTranslate、glRotate、gluOrtho2d,但它没有指导
我是一名优秀的程序员,十分优秀!