OpenGL解析法绘制旋转曲面--青花瓷_opengl 绘制三维曲面-程序员宅基地

技术标签: OpenGL  opengl  

相关背景

这里写图片描述
这里写图片描述
这里写图片描述

代码展示

Test.cpp

#include "freeglut.h"
#include "GlutWin.h"
#include <math.h>
#include <iostream>

#pragma comment(lib,"freeglut.lib")
#define PI 3.1415926
using namespace std;

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    cout << "正在绘制。。" << endl;

    /*static double theta = 0;
    theta += 0.05;
    glColor3d(1, 0.5, 1);
    glRotated(theta, 0, 1, 0);*/

    int iSeg = 0;
    int iFace = 0;
    GLfloat b = 1.0;
    GLfloat a = PI/2.0f;
    GLfloat y, x, z,r, rNext,xNext,zNext,L,LNext, theta;
    GLfloat dy = 0.5f;
    GLfloat yMax = 12.0f;
    glBegin(GL_TRIANGLE_STRIP);
        for (iSeg = 0; iSeg < 120; iSeg++)//y方向切割
        {
            for (iFace = 0; iFace <= 64; iFace++)//切割面以扇形分割
            {
                y = yMax * iSeg / 120.0;
                theta = 2 * PI*iFace / 64.0;

                r = cos(y + b) + a;  //2.11109853
                rNext = cos(y + dy + b) + a;// 1.64153349

                x = r*cos(theta);  //2.11109853
                z = r*sin(theta);  //0

                xNext = rNext * cos(theta); //1.64153349
                zNext = rNext * sin(theta); //0.000000000

                L = sqrt( pow(x, 2.0) + pow(r*sin(y + b), 2.0) + pow(z, 2.0) );  //2.75906396
                LNext = sqrt( pow(xNext, 2) + pow(rNext * sin(y + dy + b), 2.0) + pow(zNext, 2.0)); //2.31857324

                glNormal3f(x / L, r*sin(y + b) / L, z / L);
                glVertex3f(x,y,z);
                glNormal3f(xNext/LNext,rNext*sin(y+dy+b)/LNext,zNext/LNext);
                glVertex3f(xNext,y+dy,zNext);
            }
        }   
    glEnd();


    glFlush();
    glutSwapBuffers();
}

void myReshape(GLsizei width, GLsizei height)
{
    const float ar = (float)width / (GLfloat)height;
    if (height == 0)
    {
        height = 1;
    }

    //投影->视口变换
    glViewport(0, 0, width, height);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  // 黑
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

#if 0
    glOrtho(-1.0, 1.0, -1.0 / ar, 1.0 / ar, -1.0, 1.0);
#else
    gluPerspective(45.0, ar, 0.1, 100.0);
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
#endif // 透视投影、平行投影
    glScalef(10.0, 10.0, 10.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

static void myidle()
{
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{
    GlutWin *win = NULL;
    win = new GlutWin(600, 800, 100, 100, GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH, "青花瓷");

    glutDisplayFunc(myDisplay);
    glutReshapeFunc(myReshape);
    glutIdleFunc(myidle);
    glutMainLoop();

    //glEnable(GL_DEPTH_TEST);
    //glDepthFunc(GL_LESS);  //如果输入的深度值小于参考值,则通过

    //glEnable(GL_LIGHTING);
    //glEnable(GL_LIGHT0);
    //glEnable(GL_COLOR_MATERIAL);  //开启颜色追踪    

    delete win;
    return 0;
}
GlutWin.h

#pragma once
#include <windows.h>
#include "freeglut.h"

//Glut初始化
class GlutWin
{
    
public:
    GlutWin(int windowHeight, int windowWidth,int windowPosX, int windowPosY,
        unsigned int displayMode,const char * windowTitle);
    ~GlutWin() {};

private:
    const char *    windowTitle;
    int             windowHeight, windowWidth;
    int             windowPosX, windowPosY;
    int             windowID;
    unsigned int    displayMode;
    bool            fullScreen;
};
Glutwin.cpp

#include "GlutWin.h"

GlutWin::GlutWin(int windowHeight, int windowWidth,int windowPosX, int windowPosY,
    unsigned int displayMode,const char * windowTitle)
{
    windowTitle = windowTitle;
    windowHeight = windowHeight;
    windowWidth = windowWidth;
    windowPosX = windowPosX;
    windowPosY = windowPosY;
    displayMode = displayMode;
    fullScreen = false;

    char    cmd_line[8];
    char *  argv[1];
    argv[0] = cmd_line;
    int     argc = 1;

    glutInit(&argc, argv);
    glutInitWindowSize(windowWidth, windowHeight);
    glutInitWindowPosition(windowPosX, windowPosY);
    glutInitDisplayMode(displayMode);
    windowID = glutCreateWindow(windowTitle);

    const float ar = (float)windowWidth / (GLfloat)windowHeight;

#if 0
    glOrtho(-1.0, 1.0, -1.0 / ar, 1.0 / ar, -1.0, 1.0);
#else
    gluPerspective(45.0,  ar, 0.1, 100.0);
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
#endif // 透视投影、平行投影

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  // 黑
    glViewport(0, 0, windowWidth, windowHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glScalef(10.0, 10.0, 10.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tingzhushaohua/article/details/70170581

智能推荐

浙江理工大学2019年新生赛_ulire 最近在研究哈夫曼树,一种功能是将一串字符压缩为更短的 01 串的数据结构,现-程序员宅基地

文章浏览阅读1.6k次。问题 A: 你的名字题目描述Walfy同时喜欢上了n个妹子,第i个妹子的智力值为ai魅力值为bi。为了防止妹子们发现walfy是个渣男,现在walfy要给妹子排个序,这样他能按照这个排序分配和妹子聊天的时间。排序规则如下:智力高的妹子需要花费更多的时间来聊天,如果智力一样,那么魅力高的花费的时间将会多一点;如果她们的魅力也一样,姓名字典序更小的花费的时间也将多一点。对于字典序大小的定义,..._ulire 最近在研究哈夫曼树,一种功能是将一串字符压缩为更短的 01 串的数据结构,现

动手学深度学习之一一配置环境_no module named 'd21-程序员宅基地

文章浏览阅读2.3k次。一一配置环境一、安装Miniconda二、下载d21-zh安装包三、用conda创建虚拟环境四、jupyter notebook运行No moudule name'mxnet'一、安装Miniconda二、下载d21-zh安装包三、用conda创建虚拟环境#配置清华PyPI镜像(如无法运行,将pip版本升级到>=10.0.0)pip config set global.index-..._no module named 'd21

Paper Reading:Single-Shot Refinement Neural Network for Object Detection_CVPR2018-程序员宅基地

文章浏览阅读170次。Paper Reading:Single-Shot Refinement Neural Network for Object Detection_CVPR2018RefineDet论文阅读_single-shot refinement neural network for object detection

elasticsearch使用head插件打开和关闭索引_elasticsearch关闭索引刷新-程序员宅基地

文章浏览阅读1.1k次。 接着上一节的内容,这一讲着重介绍下elasticsearch使用head打开和关闭索引.....打开/关闭索引接口允许关闭一个打开的索引或者打开一个已经关闭的索引。关闭的索引只能显示索引元数据信息,不能够进行读写操作。关闭索引的两种方式,第一种是比较low的操作,不建议使用........比如我们新建一个索引student2第一种:关闭索引:我们用 PO..._elasticsearch关闭索引刷新

Verilog CIC 滤波器设计(代码自取)_cic截止频率-程序员宅基地

文章浏览阅读4.9k次,点赞21次,收藏179次。前言:积分梳状滤波器(CIC,Cascaded Integrator Comb),一般用于数字下变频(DDC)和数字上变频(DUC)系统。CIC 滤波器结构简单,没有乘法器,只有加法器、积分器和寄存器,资源消耗少,运算速率高,可实现高速滤波,常用在输入采样率最高的第一级,在多速率信号处理系统中具有着广泛应用。1. DDC 原理DDC 主要由本地振荡器(NCO) 、混频器、滤波器等组成,如下图所示。DDC 将中频信号与振荡器产生的载波信号进行混频,信号中心频率被搬移,再经过抽取滤波,恢复原始信号,实现_cic截止频率

经典算法详解(3)将大于2的偶数分解成两个素数之和-程序员宅基地

文章浏览阅读1.3k次。1 #include<iostream> 2 3 using namespace std; 4 5 bool isPrime(int n) { 6 for (int i = 2; i < n; i++) { 7 if (n%i == 0) { //能被2到把自身小1的数整除的都不是素数 8 ..._分解偶数描述任何一个大于2的偶数都可以分解为两个素数的和,而且可能有多种分

随便推点

使用poi读取excel异常IOException: OPC Compliance error [M4.3]: Producers shall not create a document ele..._exception in thread "main" cn.hutool.poi.exception-程序员宅基地

文章浏览阅读4k次。前言:  前一段时间,帮女朋友整理她们公司的破Excel文档,本着减少工作量的原则(居家好男人),帮忙写了个java main去读取整理Excel,到后来发现在读取到xlsx的excel报错,报错信息居然没看懂。。。报错信息Exception in thread "main" cn.hutool.poi.exceptions.POIException: IOException: OPC Co..._exception in thread "main" cn.hutool.poi.exceptions.poiexception: ioexceptio

Beyond Compare文件比对_beyond compare 4.2 密钥-程序员宅基地

文章浏览阅读3.2k次。Beyond Compare_beyond compare 4.2 密钥

第一章:初探Spring Cloud Config配置集中管理_springcloud 集中配置管理-程序员宅基地

文章浏览阅读1.5k次。前路艰难,但谨记,你并不孤独。Spring Cloud如火如荼,抽空研究研究Spring大家族中的新份子。具体的介绍不会粗线在本系列博文中,如需要理论等知识直接百度or谷歌。Spring Cloud中保护N多已构建好的微服务,可以做到即插即用,其中大致包含几种服务:Config、Eureka、Ribbon、Hystrix、Feign、Bus等,具体介绍及开源地址请见:Spring Cloud中文官_springcloud 集中配置管理

leetcode647. 回文子串_leetcode 647-程序员宅基地

文章浏览阅读116次。题目大意给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".解题思路动态规划,判断s[i]~s[j]是否是回文串,如果是回文串,res++。class Solution {_leetcode 647

Akka中Actor消息通信的实现原理(源码解析)_actor mailbox 实现原理-程序员宅基地

文章浏览阅读4.4k次。Akka中通过下面的方法向actor发送消息! tell 意味着 “fire-and-forget”,即异步的发送消息无需等待返回结果? ask 异步发送消息并返回代表可能回复的Future。消息在每个发件人的基础上是有序的。MailBoxAkka邮箱包含发往Actor的消息。通常每个Actor都有自己的邮箱,但是也有例外,比如BalancingPool所有路由将共享_actor mailbox 实现原理

安卓ListView的使用_android listview使用-程序员宅基地

文章浏览阅读1.1k次。listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。_android listview使用

推荐文章

热门文章

相关标签