`

给小时钟打光

阅读更多
    在昨天的基础上,加入了灯光和旋转,当打入灯光后,时钟立刻就有了立体感,并且按0可以切换灯光的关闭和打开,左右键可以让时钟进行旋转。明天加上探照灯的功能。
   
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.FreeGlut;
namespace homework3
{
    public partial class Form1 : Form
    {
        double second_rot = 0.0;
        double minit_rot = 0.0;
        double hour_rot = 0.0;
        double rot = 0.0;
        int status = 0;
        int light1_status = 1;
        DateTime mydatetime = new DateTime();
        public Form1()
        {
            InitializeComponent();
            this.simpleOpenGlControl1.InitializeContexts();
            Glut.glutInit();
        }
        private void setVolume()
        {
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            double aspect = (double)this.simpleOpenGlControl1.Size.Width / (double)this.simpleOpenGlControl1.Size.Height;
            Glu.gluPerspective(45.0, aspect, 0.1, 100.0);
            Gl.glViewport(0, 0, this.simpleOpenGlControl1.Width, this.simpleOpenGlControl1.Height);

        }
        private void myInit()
        {
            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
            float[] global_ambient = new float[] { 0.2f, 0.2f, 0.0f };
            float[] light0_ambient = new float[4] {0.2f,0.2f,0.0f,1.0f };
            float[] light0_diffuse = new float[4] {0.7f,0.7f,0.0f,1.0f };
            float[] light0_specular = new float[4] {0.9f,0.9f,0.9f,1.0f};
           
            Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, global_ambient);
            Gl.glLightfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, light0_ambient);
            Gl.glLightfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, light0_diffuse);
            Gl.glLightfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, light0_specular);
          
            Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT_AND_DIFFUSE);
            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
            Gl.glEnable(Gl.GL_LIGHTING);
            Gl.glEnable(Gl.GL_LIGHT0);

            Gl.glEnable(Gl.GL_DEPTH_TEST);
            
            
            status = 0;
        }

        private void simpleOpenGlControl1_Load(object sender, EventArgs e)
        {
            myInit();
            setVolume();
            mydatetime = DateTime.Now;
            second_rot = mydatetime.Second * 6.0;
            minit_rot = mydatetime.Minute * 6.0;
            hour_rot = mydatetime.Hour * 30+mydatetime.Minute*0.5;
            
        }

        private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();
           
            Glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

            Gl.glPushAttrib(Gl.GL_LIGHTING_BIT);
            float[] material_ambient = new float[4] { 0.2f, 0.2f, 0.0f, 1.0f };
            float[] material_diffuse = new float[4] { 0.7f, 0.7f, 0.0f, 1.0f };
            float[] material_specular = new float[4] { 0.8f, 0.8f, 0.0f, 1.0f };
            Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, material_ambient);
            Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, material_diffuse);
            Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, material_specular);
            Gl.glMaterialf(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, 35.0f);
            Gl.glRotated(rot, 0.0, 1.0, 0.0);
            Gl.glColor3ub(0, 255, 0);
            Glut.glutSolidTorus(0.15, 1.5, 40, 40);

            Gl.glPushMatrix();
            Gl.glColor3ub(255, 255, 0);
            Gl.glScaled(1.0, 1.0, 0.1);
            Glut.glutSolidSphere(1.35, 40, 40);
            Gl.glPopMatrix();
            Gl.glPopAttrib();
            Gl.glTranslated(0.0, 0.0, 0.15);
            if (rot < 90 && rot > -90)
            {
                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(0.0, 1.15, 0.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(30 * Math.PI / 180.0), 1.15 * Math.Cos(30 * Math.PI / 180.0), 0.0);
                Gl.glRotated(30.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(60 * Math.PI / 180.0), 1.15 * Math.Cos(60 * Math.PI / 180.0), 0.0);
                Gl.glRotated(60.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15, 0.0, 0.0);
                Gl.glRotated(90.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(120 * Math.PI / 180.0), 1.15 * Math.Cos(120 * Math.PI / 180.0), 0.0);
                Gl.glRotated(120.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(150 * Math.PI / 180.0), 1.15 * Math.Cos(150 * Math.PI / 180.0), 0.0);
                Gl.glRotated(150.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(0, -1.15, 0.0);
                Gl.glRotated(180.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(210 * Math.PI / 180.0), 1.15 * Math.Cos(210 * Math.PI / 180.0), 0.0);
                Gl.glRotated(210.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(240 * Math.PI / 180.0), 1.15 * Math.Cos(240 * Math.PI / 180.0), 0.0);
                Gl.glRotated(240.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(270 * Math.PI / 180.0), 1.15 * Math.Cos(270 * Math.PI / 180.0), 0.0);
                Gl.glRotated(270.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(300 * Math.PI / 180.0), 1.15 * Math.Cos(300 * Math.PI / 180.0), 0.0);
                Gl.glRotated(300.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 0);
                Gl.glTranslated(-1.15 * Math.Sin(330 * Math.PI / 180.0), 1.15 * Math.Cos(330 * Math.PI / 180.0), 0.0);
                Gl.glRotated(330.0, 0.0, 0.0, 1.0);
                Gl.glScaled(0.1, 1.0, 0.01);
                Glut.glutSolidCube(0.3);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(0, 0, 255);
                Gl.glRotated(-hour_rot, 0.0, 0.0, 1.0);
                Gl.glTranslated(0.0, 0.3, 0.0);

                Gl.glScaled(0.1, 1.0, 0.05);
                Glut.glutSolidCube(1.0);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(0, 0, 255);
                Gl.glRotated(-minit_rot, 0.0, 0.0, 1.0);
                Gl.glTranslated(0.0, 0.45, 0.0);
                Gl.glScaled(0.1, 1.8, 0.05);
                Glut.glutSolidCube(0.8);
                Gl.glPopMatrix();

                Gl.glPushMatrix();
                Gl.glColor3ub(255, 0, 255);
                Gl.glRotated(-second_rot, 0.0, 0.0, 1.0);
                Gl.glTranslated(0.0, 0.5, 0.0);
                Gl.glScaled(0.05, 2.4, 0.05);
                Glut.glutSolidCube(0.6);
                Gl.glPopMatrix();

                Gl.glPushAttrib(Gl.GL_LIGHTING_BIT);
                if (light1_status == 0)
                {
                    float[] light_position = new float[4] { (float)(-1.45 * Math.Sin(60 * Math.PI / 180.0)), (float)(-1.45 * Math.Cos(60 * Math.PI / 180.0)), 0.1f, 1.0f };
                    float[] light_direction = new float[3] { 0.0f, 0.0f, 0.0f };
                    Gl.glEnable(Gl.GL_COLOR_MATERIAL);
                    
                    Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, light_position);
                    Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_SPOT_DIRECTION, light_direction);
                    //Gl.glLightf(Gl.GL_LIGHT1, Gl.GL_SPOT_CUTOFF, (float)(Math.Atan(2.0) * 180.0 / Math.PI));
                   
                    Gl.glPushMatrix();
                    Gl.glColor3ub(255, 255, 255);
                    Gl.glTranslated(-1.45 * Math.Sin(60 * Math.PI / 180.0), -1.45 * Math.Cos(60 * Math.PI / 180.0), 0.1);
                   
                    Gl.glDisable(Gl.GL_LIGHTING);
                    Glut.glutSolidSphere(0.15, 20, 20);
                    Gl.glEnable(Gl.GL_LIGHTING);
                    
                    Gl.glPopMatrix();
                    Gl.glDisable(Gl.GL_COLOR_MATERIAL);
                    
                }
                Gl.glPopAttrib();
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            second_rot += 6.0;
            if (second_rot % 360 == 0)
            {
                minit_rot += 6.0;
                hour_rot += 0.5;

            }
            this.simpleOpenGlControl1.Refresh();
        }

        private void simpleOpenGlControl1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys .D0:
                    if (status == 0)
                    {
                        Gl.glDisable(Gl.GL_LIGHT0);
                        status = 1;
                    }
                    else
                    {
                        Gl.glEnable(Gl.GL_LIGHT0);
                        Gl.glDisable(Gl.GL_LIGHT1);
                        status = 0;
                    }
                    break;
                  case Keys.Left:
                    if (rot >= 270 )
                        rot = -90;
                    rot += 5;
                    
                    break;
                case Keys.Right:
                    if (rot <= -270)
                        rot = 90;
                    rot -= 5;
                    break;
                case Keys .D1:
                    if (light1_status == 1)
                   {

                       Gl.glEnable(Gl.GL_LIGHT1);
                       light1_status = 0;
                   }
                else 
                  {
                      Gl.glDisable(Gl.GL_LIGHT1);
                     light1_status = 1;
                  }
                    break;
                case Keys.D2:
                    break;
                case Keys.D3:
                    break;
                case Keys.D4:
                    break;
                   
            }
            this.simpleOpenGlControl1.Refresh();
        }

            }
}

    

   呵呵,洗个澡,然后复习组合数学,下个礼拜又要进行第二次组合数学的期中考试,还有SE的阶段性考试,哎,又要累了。。。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics