请教unity 制作tilemap的流程
using UnityEngine;
using System.Collections;
using UnityEditor;
[ExecuteInEditMode]
public class TilemapEditor : MonoBehaviour {
public Material material;
Vector2 middlePoint;
public Vector2 one;
public Vector2 two;
public Vector2[] list;
Vector2[] pointone=new Vector2[50];
Vector2[] pointtwo=new Vector2[50];
Vector2[] pointThree= new Vector2[50];
Vector2[] pointFour= new Vector2[50];
public float test;
// Use this for initialization
void Start () {
// Handles.DrawLine(new Vector3(0,0,0),new Vector3(100,300,0));
}
// Update is called once per frame
void Update () {
// Debug.DrawLine(new Vector3(0,0,0),new Vector3(100,300,0));
}
void OnPostRender()
{
if(!material)
{
return;
}
material.SetPass(0);
GL.PushMatrix();
GL.LoadOrtho();
// GL.MultMatrix(transform.localToWorldMatrix);
GL.Begin(GL.LINES);
for(int i=0; i<20;i++)
{
pointone[i]= Vector2.Lerp(two,one,test*i);
pointtwo[i]=Vector2.Lerp(list[0],new Vector2(two.x,two.y-(two.y-one.y)*2),test*i);
pointThree[i]=Vector2.Lerp(two,list[0],test*i);
pointFour[i]= Vector2.Lerp(one,new Vector2(two.x,two.y-(two.y-one.y)*2),test*i);
}
// pointone[0]= Vector2.Lerp(two,one,test);
// pointtwo[0]=Vector2.Lerp(list[0],new Vector2(two.x,two.y-(two.y-one.y)*2),test);
DrawLine(one.x,one.y,two.x,two.y);
DrawLine(list[0].x,list[0].y,two.x,two.y);
DrawLine(one.x,one.y,two.x,two.y-(two.y-one.y)*2);
DrawLine(two.x,two.y-(two.y-one.y)*2,list[0].x,list[0].y);
for(int i=0; i<20;i++)
{
DrawLine(pointone[i].x,pointone[i].y,pointtwo[i].x,pointtwo[i].y);
DrawLine(pointThree[i].x,pointThree[i].y,pointFour[i].x,pointFour[i].y);
}
GL.End();
GL.PopMatrix();
}
void DrawLine(float x1,float y1,float x2,float y2)
{
// GL.PushMatrix();
GL.Vertex(new Vector3(x1/Screen.width,y1/Screen.height,0));
GL.Vertex(new Vector3(x2/Screen.width,y2/Screen.height,0));
// GL.PushMatrix();
}
// void OnSceneGUI()
// {
// Handles.color=Color.blue;
// HandleUtility.Repaint();
// }
}
Opengl中的glLoadName 和 glPushName有什么区别
glBindTexture(GL_TEXTURE_2D, g_Texture[0]);
glLoadName(SUN);
glBegin(GL_LINES);
glEnd();
glPushMatrix();
glTranslatef(0, 0, 0);
glRotatef(SunRotation, 0, 1.0, 0);
gluSphere(pObj, 0.5f, 20, 20);
glPopMatrix();
glEnd();
解析一段OpenGL的小程序
我不知道我是否能回答你的问题,但是我把提示写在程序边上。
void display(void)
{
node* point;
//清空颜色缓存和深度缓存。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
point = points;
while (point) {
// 压入一个modelmatrix 到modelmatrix stack上
//modelmatrix指对物体所作的线性变换,你可以参考OpenGL红宝书
// 下面的glTranslatef指加入一个平移变换
glPushMatrix();
//指定当前的颜色是point->r, point->g, point->b
glColor3ub(point->r, point->g, point->b);
//做一个平移变换,在弹出这个model matrix 之前,
// 所有的几何都是基于以(point->x, point->y,0)为原点的坐标系。
glTranslatef(point->x, point->y, 0.0);
//画一个Cone.坐落于 (point->x, point->y, 0.0)
// 这个时候的深度判断函数是Less,就是说明这个Cone会被前面画的几何遮挡。
glutSolidCone(400, 1.0, 32, 1);
if (point) {
//这相当于关闭深度判断
glDepthFunc(GL_ALWAYS);
// 设为红色
glColor3f(1, 0, 0);
//画Cone的顶点,这样不论怎样
// 顶点都可以画出来,不会被其他几何遮挡
glBegin(GL_POINTS);
glVertex2i(0, 0);
glEnd();
// 重置深度判断函数
glDepthFunc(GL_LESS);
}
// 弹出那个平移变换,这样空间又回到标准空间
glPopMatrix();
// 画下一个Cone
point = point->next;
}
glutSwapBuffers();
}
glLightfv如何使用
penGL编程轻松入门之使用光照和材质
2006-05-1811:24作者:黄燕出处:天极开发责任编辑:方舟
使用了光照和材质可以使物体更逼真,具有立体感。
例4就是没有使用光照使呈现在我们眼前的物体茶壶和立方体没有立体感。
例6:绘制三个使用不同材质的球体。
#include <windows.h>
#include <GL/glut.h>
GLfloat light_position[] = {0.0,3.0,6.0,0.0};
GLfloat no_mat[] = {0.0,0.0,0.0,1.0};
GLfloat mat_grey_ambient[] = {0.5,0.5,0.5,1.0};
GLfloat mat_red_ambient[] = {0.0,0.0,1.0,1.0};
GLfloat mat_diffuse[] = {0.8,0.2,0.5,1.0};
GLfloat mat_specular[] = {1.0,1.0,1.0,1.0};
GLfloat no_shininess[] = {0.0};
GLfloat low_shininess[] = {5.0};
GLfloat high_shininess[] = {100.0};
GLfloat mat_emission[] = {0.3,0.2,0.2,0.0};
void myInit(void)
{
glLightfv(GL_LIGHT2,GL_POSITION,light_position);//设置光源
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);//指定深度比较中使用的数值
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
/*为光照模型指定材质参数*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);
glColorMaterial(GL_FRONT,GL_AMBIENT);//使材质色跟踪当前颜色
glEnable(GL_COLOR_MATERIAL);
/*第一个球形*/
glPushMatrix();
glColor3fv(no_mat);
glTranslatef(-2.5,1.5,0.0);
glRotatef(15.0,1.0,0.0,0.0);
glutSolidSphere(1.2,20.0,20.0);
glPopMatrix();
/*第二个球形*/
glPushMatrix();
glColor3fv(mat_grey_ambient);
glRotatef(15.0,1.0,0.0,0.0);
glutSolidSphere(1.2,20.0,20.0);
glPopMatrix();
/*第三个球形*/
glPushMatrix();
glColor3fv(mat_red_ambient);
glTranslatef(2.5,-1.5,0.0);
glRotatef(15.0,1.0,0.0,0.0);
glutSolidSphere(1.2,20.0,20.0);
glPopMatrix();
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glFlush();
}
void myReshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w <= h)
glOrtho(-5.5,5.5,-5.5*(GLfloat)h/(GLfloat)w,5.5*(GLfloat)h/(GLfloat)w,-5.5,5.5);
else
glOrtho(-5.5*(GLfloat)w/(GLfloat)h,5.5*(GLfloat)w/(GLfloat)h,-5.5,5.5,-5.5,5.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc,char ** argv)
{
/*初始化*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
/*创建窗口*/
glutCreateWindow(" Light&Material ");
/*绘制与显示*/
myInit();
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
函数myInit中:
·glLight设置光源的参数。
有三个参数,第一个参数指定光照的数目,最大为8。
第二个参数为光照的单值光源参数。
第三个参数为赋给第二个参数的值,本例中即为将light_position的值赋值给GL_POSITION。
display函数中:
·glMaterial为光照模型指定材质参数。
第一个参数为改变材质的面,其值必为GL_FRONT, GL_BACK或GL_FRONT_AND_BACK中的一个。
第二个参数为需要改变的材质参数。
第三个参数为赋给参数二的值或指向值的指针。
本例中均为指针。
·glColorMateria使材质色跟踪当前颜色。
第一个参数指定哪一个面需要使材质色跟踪当前颜色。
第二个参数指定哪个参数需要跟踪颜色。
OpenGL中的坐标转换!详细一点希望看到每一步执行完时的具体坐标以及转换的顺序等!谢谢大神了
先前我在调用OpenGL开发图形环境时,坐标变换也曾困扰我好长一阵子,记得当时是在为每个图形实例配置各自的轨迹球时要求修正轨迹球算法。
言归正传,首先您须知道OpenGL中的矩阵为列主序矩阵,这是您关于OpenGL矩阵变换进行正确理解与运用的大前提(若对此没有概念请先花半小时上网弄明白,这里不赘述)。
其次需要注意,对于坐标变换矩阵操作的有两种理解方式,不妨称“顺式”与“反式”(若不明白还请自已上网查阅,这里点到为止),都是正确的,在不同的时候选择恰当的理解方式可以事半功倍哦!就本例子而言“顺式”理解更为方便
下面分析相关代码:
glPushMatrix();将当前的变换矩阵压栈,允许之后通过矩阵弹栈以撤销之间的变换操作(好比系统还原中设置“还原点”)
glTranslatef( -0.3, 0.0, 0.0);
这是您问题的重点吧?!先来普及知识:
OpenGL中有个绝对坐标系,它以屏幕中心为原点,水平向右为X轴,竖直向上为Y轴,垂直屏幕向外为Z轴。
在“顺式”理解下,该坐标系是不动的,而想象初始时你就出在原点位置,眼睛看着Z轴负方向,1.随后命令——glTranslatef( -0.3, 0.0, 0.0);好,这下你沿X负方向走了0.3f,来到(-0.3, 0.0, 0.0)处(注意你并没有转头,眼睛仍然看着Z轴负方向)
2.再命令glRotatef( (GLfloat)sh, 0.0, 0.0, 1.0 );对,你以Y轴正方向为转轴将脑袋身子扭转了sh角,但注意你的位置并未改变。
3.又glTranslatef(1.0, 0.0, 0.0);这下你沿X正方向走了1.0f,但重点注意!!——这里的X轴是相对你而言的,不是绝对坐标系中的X轴(所谓“顺式”就体现在这里),即每一步变换都是在如下坐标系中进行的:你眼睛看着的是Z轴负方向,脑袋指向Y轴正方向,右手边为X轴正方向
glPushMatrix();再次压栈
4.glScalef(2.0, 0.4, 1.0);将尺度进行缩放,该步骤无所谓坐标系
glutWireCube(1.0);你在自己的位置放了一个立方体,至于你自己在哪里,应很容易便可算出吧~
glPopMatrix();弹栈,即还原至第4步前的变换状态
相信已解释得够通俗的了,不懂再问吧~
opengl 中的camera控制方法
gluLookAt() 是从哪个方向,哪个远近看物体,即,计算投影。
glRotatef() 是空间里转动物体,改变物体在空间的坐标。
glTranslatef() 是空间里平移物体,改变物体在空间的坐标。
用
glPushMatrix();
。
。
。
。
。
glPopMatrix();
把要变换的括起来,这两句东西类似括号,用来括矩阵变换。
glPushMatrix(); // 进一层
glTranslatef(...);
glPushMatrix(); // 再进一层
glRotatef(..);
画三角形1
glPopMatrix(); // 退回一层
glPopMatrix(); // 再退回一层
画三角形2