| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5054 人关注过本帖
标题:发个好玩的东西 ######
只看楼主 加入收藏
虎子huzi
该用户已被删除
收藏
得分:2 
回复 楼主 rtgirl
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-15 22:42
rtgirl
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-15 23:41
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
程序代码:
/*******************************************************************************
*                                                                              *
*                                   Viewmol                                    *
*                                                                              *
*                               M A T R I X . C                                *
*                                                                              *
*                 Copyright (c) Joerg-R. Hill, October 2003                    *
*                                                                              *
********************************************************************************
*
* $Id: matrix.c,v 1.6 2004/08/29 15:41:28 joehill Exp $
* $Log: matrix.c,v $
* Revision 1.6  2004/08/29 15:41:28  joehill
* Release 2.4.1
*
* Revision 1.5  2003/11/07 11:06:42  jrh
* Release 2.4
*
* Revision 1.4  2000/12/10 15:11:04  jrh
* Release 2.3
*
* Revision 1.3  1999/05/24 01:26:19  jrh
* Release 2.2.1
*
* Revision 1.2  1999/02/07 21:52:01  jrh
* Release 2.2
*
* Revision 1.1  1998/01/26 00:35:07  jrh
* Initial revision
*
*/
#include<math.h>
#include<stdio.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<X11/StringDefs.h>
#include "viewmol.h"

extern void quaternionToMatrix(GLenum, float *);

void getMatrix(double matrix[4][4]);
void multMatrix(double matrix1[4][4], double matrix2[4][4], double matrix3[4][4]);
void transformCoordinates(int, float input[4], float output[4]);
void makeMatrix(double, float, float, float, float mat[3][3]);

extern struct WINDOW windows[];
extern float *rotObject;

void getMatrix(double matrix[4][4])
{
  double mvmat[4][4], prmat[4][4];

  glGetDoublev(GL_MODELVIEW_MATRIX, &mvmat[0][0]);
  glGetDoublev(GL_PROJECTION_MATRIX, &prmat[0][0]);
  multMatrix(mvmat, prmat, matrix);
}

void multMatrix(double matrix1[4][4], double matrix2[4][4], double matrix3[4][4])
{
  register int i, j, k;

  for (i=0; i<4; i++)
  {
    for (j=0; j<4; j++)
    {
      matrix3[i][j]=0.0;
      for (k=0; k<4; k++)
        matrix3[i][j]+=matrix1[i][k]*matrix2[k][j];
    }
  }
}

void transposeMatrix(double matrix[4][4])
{
  double help;
  register int i, j;

  for (i=0; i<4; i++)
  {
    for (j=i+1; j<4; j++)
    {
      help=matrix[i][j];
      matrix[i][j]=matrix[j][i];
      matrix[j][i]=help;
    }
  }
}

void transformCoordinates(int which, float input[4], float output[4])
{
  float matrix[4][4];

  glPushMatrix();
  glLoadIdentity();
  quaternionToMatrix(GL_MODELVIEW, &rotObject[4*which]);
  glGetFloatv(GL_MODELVIEW_MATRIX, &matrix[0][0]);
  glPopMatrix();

  output[0]=matrix[0][0]*input[0]+matrix[1][0]*input[1]+matrix[2][0]*input[2]+matrix[3][0]*input[3];
  output[1]=matrix[0][1]*input[0]+matrix[1][1]*input[1]+matrix[2][1]*input[2]+matrix[3][1]*input[3];
  output[2]=matrix[0][2]*input[0]+matrix[1][2]*input[1]+matrix[2][2]*input[2]+matrix[3][2]*input[3];
  output[3]=matrix[0][3]*input[0]+matrix[1][3]*input[1]+matrix[2][3]*input[2]+matrix[3][3]*input[3];
}

void getScreenCoordinates(double xw, double yw, double zw, double *xs,
                          double *ys, double *zs)
{
  GLdouble mvMatrix[16], prMatrix[16];
  GLint viewport[4];

  glGetDoublev(GL_MODELVIEW_MATRIX, mvMatrix);
  glGetDoublev(GL_PROJECTION_MATRIX, prMatrix);
  glGetIntegerv(GL_VIEWPORT, viewport);
  gluProject(xw, yw, zw, mvMatrix, prMatrix, viewport, xs, ys, zs);
  *ys=(double)viewport[3]-(*ys);
}

void getWorldCoordinates(double xs, double ys, double zs, double *xw,
                         double *yw, double *zw)
{
  GLdouble mvMatrix[16], prMatrix[16];
  GLint viewport[4];

  glGetDoublev(GL_MODELVIEW_MATRIX, mvMatrix);
  glGetDoublev(GL_PROJECTION_MATRIX, prMatrix);
  glGetIntegerv(GL_VIEWPORT, viewport);
  gluUnProject(xs, ys, zs, mvMatrix, prMatrix, viewport, xw, yw, zw);
}

void rotateAxis(float axis[3], float about[3], double angle)
{
  float mat[3][3], s1, s2;

  makeMatrix((-angle), about[0], about[1], about[2], mat);
  s1=axis[0];
  s2=axis[1];
  axis[0]=mat[0][0]*s1+mat[1][0]*s2+mat[2][0]*axis[2];
  axis[1]=mat[0][1]*s1+mat[1][1]*s2+mat[2][1]*axis[2];
  axis[2]=mat[0][2]*s1+mat[1][2]*s2+mat[2][2]*axis[2];
}

void makeMatrix(double angle, float x, float y, float z, float mat[3][3])
{
  double torad=atan(1.0)/45.0;
  float mag, s, c;
  float xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c;

  angle*=torad;
  s=(float)sin(angle);
  c=(float)cos(angle);

  mag=1.0/sqrt(x*x+y*y+z*z);
  x*=mag;
  y*=mag;
  z*=mag;

  xx=x*x;
  yy=y*y;
  zz=z*z;
  xy=x*y;
  yz=y*z;
  zx=z*x;
  xs=x*s;
  ys=y*s;
  zs=z*s;
  one_c=1.0F-c;

  mat[0][0]=(one_c*xx)+c;
  mat[0][1]=(one_c*xy)-zs;
  mat[0][2]=(one_c*zx)+ys;

  mat[1][0]=(one_c*xy)+zs;
  mat[1][1]=(one_c*yy)+c;
  mat[1][2]=(one_c*yz)-xs;

  mat[2][0]=(one_c*zx)-ys;
  mat[2][1]=(one_c*yz)+xs;
  mat[2][2]=(one_c*zz)+c;
}

void printMatrix(int which)
{
  double matrix[4][4];
  int i;

  glGetDoublev(which, &matrix[0][0]);
  for (i=0; i<4; i++)
    printf("%f  %f  %f  %f\n", matrix[i][0], matrix[i][1], matrix[i][2], matrix[i][3]);
}
matrix.zip (28.08 KB)


——————————————
老公说这个代码和楼主的不怎么沾边,哈哈。随便搜索了下就贴上来了,大家不要学我喔,我太懒了,不过想学的多查找多思考喔

[ 本帖最后由 pgy 于 2010-5-18 03:12 编辑 ]

我可好玩啦...不信你玩玩^_^
2010-05-16 00:26
rtgirl
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-16 00:48
lxg1123
Rank: 2
等 级:论坛游民
帖 子:31
专家分:18
注 册:2010-5-11
收藏
得分:0 
要求源码
2010-05-16 01:01
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
动画都是 像素基于一定的数学公式改变坐标形成的。

如果  五角星 在旋转的时候自动会出现那种效果, 这个动画很容易做出来,
简单的碰撞检测:五角星的坐标超过屏幕坐标系, 根据入射角 等于 反射角 改变一下方向就行了,

我就是真命天子,顺我者生,逆我者死!
2010-05-16 05:53
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:2 
效果很不错 赞一个!~~
2010-05-16 06:03
rtgirl
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-16 13:02
我才是笨蛋
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-5-16
收藏
得分:0 
源文件运行报错 很多错误 我用的是VC++6.0编译器
2010-05-16 13:28
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 18楼 rtgirl
五角星转的时候, 后面跟着几跟螺旋线,看样子是转动的时候自己带出来的,

我就是真命天子,顺我者生,逆我者死!
2010-05-16 14:40
快速回复:发个好玩的东西 ######
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030592 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved