精华内容
下载资源
问答
  • xfeatures2d.zip

    2020-02-12 14:52:30
    将文件解压复制到OpenCV源码文件根目录中的隐藏文件夹.cache/xfeatures2d/下. 错误内容: ~/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:673:20: fatal error: boostdesc_bgm.i: No such file or ...
  • Unity2D 水波效果

    2016-03-18 11:05:00
    Unity2D 实现水波效果
  • 放在编译文件夹的downloads下面,解压放置
  • 《Cocos2d-x实战 JS卷 Cocos2d-JS开发》完整源码
  • cocos引擎老版本下载集合(cocos2d-x-2.2.1 - 3.5),分别有cocos2d-x-3.5、cocos2d-x-3.4、cocos2d-x-3.2、cocos2d-x-2.2.6、cocos2d-x-2.2.2和cocos2d-x-2.2.1。
  • 如果你想用cocos2d开发android游戏,但是又不方便找包,这里就可以为你提供cocos2d开发的所有相关包,解压后得到libs文件夹即可。
  • 2D Toolkit 2.5.4.unitypackage

    热门讨论 2015-07-20 15:07:43
    uinty4.6以后不能使用2.3和2.4了,必须更新2.5来使用。2D Toolkit 2.5.4.unitypackage
  • cocos2d-x实战_lua卷

    2017-01-07 17:49:02
    cocos2d-x实战_lua卷
  • cocos2d-x 3.x 游戏开发实战光盘源码

    热门讨论 2016-04-24 10:32:55
    cocos2d-x 3.x 游戏开发实战光盘源码
  • 谷歌开源Cartographer的论文 Real-Time Loop Closure in 2D LIDAR SLAM
  • HT for Web - Box2d

    2015-05-14 23:01:21
    一直在找苦苦寻找一个Box2D的物理引擎javascript整合例子,发现 ...非常适合Box2D初学者入门直观的学习和测试,不敢私藏这么好的例子,0资源分拿来和大家分享,希望能帮助到些同学
  • cocos2d-X 3.x游戏案例开发大全随书光盘下载,仅供学习分享!
  • HYDRUS-2D安装包

    2014-11-25 20:00:40
    此软件为HYDRUS系列软件,可用于土壤水盐运移
  • Graphics2D类基本使用

    千次阅读 2021-01-28 13:06:35
    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。 一、绘图属性 Graphics2D...

    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。

    一、绘图属性

    Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。图形状态属性用特定的对象存储。

    1. stroke属性

    stroke属性控制线条的宽度、笔形样式、线段连接方式或短划线图案。该属性的设置需要先创建BasicStroke对象,再调用setStroke()方法来设置。创建BasicStroke对象的方法有:

    • BasicStroke(float w):指定线条宽w。

    • BasicStroke(float w,int cap, int join):

    cap是端点样:CAP_BUTT(无修饰),CAP_ROUND(半圆形末端),CAP_SQUARE(方形末端,默认值)。

    Join定义两线段交汇处的连接方式:JOIN_BEVEL(无修饰),JOIN_MTTER(尖形末端,默认值),JOIN_ROUND(圆形末端)。

    2. paint属性

    paint属性控制填充效果。先调用以下方法确定填充效果,理用setPaint()方法设置。

    • GradientPaint(float x1,float y1,Color c1,float x2,flaot y2,Color c2):从(x1,y1)到(x2,y2)颜色从c1渐变到c2。其中:参数c1,c2决定这个渐变色是从颜色c1渐变到颜色c2。参数x1,y1,x2,y2决定了渐变的强弱,即要求从点(x1,y1)出发到达点(x2,y2),颜色从c1变成c2。

    • GradientPaint(float x1,float y1,Color c1,float x2,float y2,Color c2,Boolean cyclic):如果希望渐变到终点又是起点的颜色,应将cyclic设置为true。

    3. transform属性

    transform 属性用来实现常用的图形平移、缩放和斜切等变换操作。首先创建AffineTransform对象,然后调用setTransform()方法设置transform属性。最后,用具有指定属性的Graphics2D对象绘制图形。创建AffineTransform对象的方法有:

    • getRotateinstrance(double theta):旋转theta弧度。

    • getRotateInstance(double theta,dioble x,double y):绕旋转中心(x,y)旋转。

    • getScaleInstance(double sx,double sy):x和y 方向分别按sx,sy比例变换。

    • getTranslateInstance(double tx,double ty):平移变换。

    • getShearInstance(double shx,double shy):斜切变换,shx和shy指定斜拉度。

    也可以先创建一个没有transform属性的AffineTransform对象,然后用以下方法指定图形平移、旋转、缩放变换属性。

    • transelate(double dx,double dy):将图形在x轴方向平移dx像素。

    • scale(double sx,double sy):图形在x轴方向缩放sx倍,纵向缩放sy倍。

    • rotate(double arc,double x, double y):图形以点(x,y)为轴点,旋转arc弧度。

    例如,创建AffineTransform对象:

    AffineTransform trans = new AffineTransform();
    

    为AffineTransform对象指定绕点旋转变换属性:

    Trans.rotate(50.0*3.1415927/180.0,90,80);
    

    接着为Graphics2D 的对象g2d设置具有上述旋转变换功能的“画笔”:

    Graphics2D g2d = (Graphics2D)g;g2d.setTranstorm(trans);
    

    最后,以图形对象为参数调用具有变换功能的Graphics2D 对象的draw()方法。例如,设已有一个二次曲线对象curve,以下代码实现用上述旋转功能的g2d对象绘制这条二次曲线:

    g2d.draw(curve);
    

    4. clip属性

    clip属性用于实现剪裁效果。设置剪裁属性可调用setClip()方法确定剪裁区的Shape。连续多个setClip()得到它们交集的剪裁区。

    ##5. composit属性

    composit属性设置图形重叠区域的效果。先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite对象,再通过setComposite()方法设置混合效果。Alpha值的范围为0.0f(完全透明)-0.1f(完全不透明)。

    二、Graphics2D类绘图

    Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。主要有:
    Line2D线段类,RoundRectangle2D圆角矩形类,Ellipse2D椭圆类,Arc2D圆弧类,QuadCurve2D二次曲线类,CubicCurve2D三次曲线类。

    要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态方法Double()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。例如以下代码用Graphics2D的新方法绘制线段和圆角矩形:

    package icu.xslblog;
    
    import org.junit.Test;
    
    import javax.imageio.IIOImage;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageWriteParam;
    import javax.imageio.ImageWriter;
    import javax.imageio.stream.ImageOutputStream;
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Iterator;
    
    /**
     * @ClassName TestGraphics2D
     * @Description: TODO
     * @Author xsl
     * @Date 2020/11/2 14:26
     */
    public class Graphics2DTest {
    
        @Test
        public void test1() throws IOException {
    
            // 获取源图片输入流
            FileInputStream imgFileStream = new FileInputStream("E:\\1.png");
            // 用imageIO读取图片
            Image image = ImageIO.read(imgFileStream);
            // 利用BufferedImage,将图片加载到内存中
            int height = image.getHeight(null);
            int width = image.getWidth(null);
            BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 获取图像对象,来对图片进行处理
            Graphics2D g = bufImg.createGraphics();
            //抗锯齿
            RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            rh.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            rh.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            g.setRenderingHints(rh);
    
            // 画一条线
            g.drawImage(image, 0, 0, width, height, null);
            Stroke s = new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
            g.setStroke(s);
    		//新方法
            Line2D line = new Line2D.Double(30.0,30.0,340.0,30.0);
            g.draw(line);
    		//旧方法
    		//g.drawLine(30,50,300,300);
    		//g.drawLine(300,300,120,0);
    		//g.drawLine(120,0,30,50);
            // 为了保证原质量输出,用ImageWriter输出图片
            Iterator writers = ImageIO.getImageWritersByFormatName("png");
            ImageWriter writer = (ImageWriter) writers.next();
            // 指定输出路径
            File f = new File("E:\\test\\out.png");
            ImageOutputStream outStream = ImageIO.createImageOutputStream(f);
            // 修改ImageWriteParam,原质量输出图片
            ImageWriteParam imageWriteParam = writer.getDefaultWriteParam();
            // 将BufferedImage转换为IIOImage,进而输出图片
            IIOImage iioImage = new IIOImage(bufImg, null, null);
            // 输出
            writer.setOutput(outStream);
            writer.write(null,iioImage,imageWriteParam);
        }
    }
    

    也可以先用java.awt.geom包提供的Shape对象,并用单精度Float坐标或双精度Double坐标创建Shape对象,然后再用draw()方法绘制。例如,以下代码先创建圆弧对象,然后绘制圆弧:

    Shape arc = new Arc2D.Float(30,30,150,150,40,100,Arc2D.OPEN);
    g2d.draw(arc)//绘制前面创建的图形对象arc
    

    三、Graphics2D的几何图形类

    1.线段

    //声明并创建线段对象起点是(2,3),终点是(200,300)
    Line2D line = new Line2D.Double(2,3,200,300);
    

    2.矩形

    //声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40
      Rectangle2D rect = new Rectangle2D.Double(20,30,80,40);
    

    3.圆角矩形

    //左上角是(20,30),宽是130,高是100,圆角的长轴是18,短轴是15。
    RoundRectangle2D rectRound = new RoundRectangle2D.Double(20,30,130,100,18,15);
    

    4.椭圆

    //左上角 (20,30),宽是100,高是50
    Ellipse2D ellipse = new Ellipse2D.Double(20,30,100,50);
    

    5.弧线

    Arc2D arc1 = new Arc2D.Double(8,30,85,60,5,90,Arc2D.OPEN);
    //外接矩形的左上角(10,30),宽85,高60,起始角是5度,终止角是90度
    Arc2D arc2 = new Arc2D.Double(20,65,90,70,0,180,Arc2D.CHORD);
    Arc2D arc3 = new Arc2D.Double(40,110,50,90,0,270,Arc2D.PIE);
    

    参数Arc2D.OPEN、Arc2D.CHORD、Arc2D.PIE分别表示圆弧是开弧、弓弧和饼弧。

    6.二次曲线

    二次曲线用二阶多项式表示:

    y(x)=ax2+bx+c
    

    一条二次曲线需要三个点确定:始点、控制点和终点。

    QuadCurve2D curve1 = new QuadCurver2D.Double(20,10,90,65,55,115);
    QuadCurve2D curve2 = new QuadCurver2D.Double(20,10,15,63,55,115);
    QuadCurve2D curve3 = new QuadCurver2D.Double(20,10,54,64,55,115);
    

    方法Double()中的6个参数分别是二次曲线的始点、控制点和终点。以上3条二次曲线的开始点和终点分别相同。

    7.三次曲线

    三次曲线用三阶多项式表示:

    y(x)=ax3+bx2+cx+d
    

    一条三次曲线需要四个点确定:始点、两个控制点和终点。

      CubicCurve2D curve1 = new CubicCurve2D.Double(12,30,50,75,15,15,115,93);
      CubicCurve2D curve2 = new CubicCurve2D.Double(12,30,15,70,20,25,35,94);
      CubicCurve2D curve3 = new CubicCurve2D.Double(12,30,50,75,20,95,95,95);
    

    方法Double()中的8个参数分别是三次曲线的始点、两个控制点和终点。

    一般的方程曲线的绘制过程用一个循环控制。通过循环产生自变量的值,按照方程计算出函数值,再作必要的坐标转换:原点定位的平移变换,图像缩小或放大的缩放变换,得到曲线的图像点,并绘制这个点。以绘制以下曲线方程为例:

    y(x)=sin(x)+cos(x),
    

    绘制的部分代码可以写成如下:

    double x0,y0,x1,y1,x2,y2,scale;
    x0=100;y0=80;
    scale =20.0;
    for(x1=-3.1415926d;x1<=2*3.1415926d;x1+=0.01d){
    	y1=Math.sin(x1)+Math.cos(x1);
    	//(x2,y2)是图像点
    	x2=x0+x1*scale;y2=y0+y1*scale;
    	//画一个圆点作为图像点
        g.fillOval((int)x2,(int)y2,1,1);
    }
    

    四、实际应用场景

    由于业务需要需在背景图上

    1. 动态写上研报标题和作者并达到自动换行

    2. 将微信小程序二维码合成在背景图上

    效果如下图

    在这里插入图片描述

    代码如下为方便将此编写成工具类:

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.InputStream;
     
    import javax.imageio.ImageIO;
     
     
    /**
    * <p>Title: CompositePicture</p>
    * <p>Description: 图片合并</p>
    */
    public class CompositePicture {
    	
    	/**
    	 * 
    	 * @param path  加载背景图片的地址
    	 * @param documentId  我的研报的标识 用于合成新图的名称        这个大家可根据自己的需要是否传参都可
    	 * @param inputStream  微信小程序二维码的 输入流  不知如何生成微信小程序的可以  上微信开发者api上看  或者网上找资源即可
    	 * @param title 研报标题   就是要在背景图上展示的文字   大家根据自己的需求可替换成用户名或者别的 
    	 * @param authorNameAndDate 研报作者  也是要在背景图上展示的文字  大家根据自己的需求可替换成用户名或者别的 
    	 * @param fontSize 字体的大小
    	 * @return
    	 */
    	public static String compositePicture(String path,Long documentId,InputStream inputStream, String title, String authorNameAndDate, int fontSize) {
    		String originalFilename = documentId+".png";
    		try {
    			// 加载背景图片
    			BufferedImage imageLocal = ImageIO.read(new File(path + "share_background.png"));
    			int srcImgWidth = imageLocal.getWidth(null);
    			int srcImgHeight = imageLocal.getHeight(null);
    			
    			// 加载微信小程序二维码并转换为BufferedImage
    			BufferedImage imageCode = ImageIO.read(inputStream);
    			// 以背景图片为模板
    			Graphics2D g = imageLocal.createGraphics();
    			// 消除文字锯齿
    			g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    			// 在模板上添加用户二维码(地址,左边距,上边距,图片宽度,图片高度,未知)
    			g.drawImage(imageCode, 367, imageLocal.getHeight() - 170, 150, 150, null);
    			Font font1 = new Font("微软雅黑", Font.BOLD, fontSize);// 添加字体的属性设置
    			g.setFont(font1);
    			Color color1 = new Color(100,0,0);
    			g.setColor(color1);
    			
    			String waterMarkContent = title;
    			// 截取研报标题 如: 科技:MWC:5G和边缘计算设备设计生产思路更加明确      展示为   科技:
    			g.drawString(waterMarkContent.substring(0,waterMarkContent.indexOf(":")+1),20,200);
    			// 截取研报标题 如: 科技:MWC:5G和边缘计算设备设计生产思路更加明确      展示为   MWC:5G和边缘计算设备设计生产思路更加明确
    			waterMarkContent=waterMarkContent.substring(waterMarkContent.indexOf(":")+1);
    			// 获取水印文字总长度
    			int fontlen = getWatermarkLength(waterMarkContent, g);
    			int line = fontlen / srcImgWidth;// 文字长度相对于图片宽度应该有多少行
     
    			// 文字叠加,自动换行叠加
    			int tempX = 20;
    			int tempY = 260;
    			int tempCharLen = 0;// 单字符长度
    			int tempLineLen = 0;// 单行字符总长度临时计算
    			System.out.println("水印文字总长度:" + fontlen + ",图片宽度:" + srcImgWidth + ",图片高度:" + srcImgHeight+ ",字符个数:" + waterMarkContent.length()+ ",文字行数:" + line+",x初始坐标:" + tempX+",y初始坐标:" + tempY);
    			StringBuffer sb = new StringBuffer();
    			for (int i = 0; i < waterMarkContent.length(); i++) {
    				char tempChar = waterMarkContent.charAt(i);
    				tempCharLen = getCharLen(tempChar, g);//获取标题长度
     
    				if ((tempLineLen) >= srcImgWidth) {
    					g.drawString(sb.toString(), tempX, tempY);// 长度已经满一行,进行文字叠加
    					
    					sb.delete(0, sb.length());// 清空内容,重新追加
    					
    					tempY += fontSize+10;// 长度已经满一行,Y的位置加10字符高度
     
    					tempLineLen =0;
    				}
    				sb.append(tempChar);// 追加字符
    				tempLineLen += tempCharLen;
    			}
    			g.drawString(sb.toString(), tempX, tempY);// 最后叠加余下的文字
    			Font font2 = new Font("微软雅黑", Font.PLAIN, 23);// 添加字体的属性设置
    			g.setFont(font2);
    			Color color2 = new Color(255,255,255);
    			g.setColor(color2);
    			g.drawString(authorNameAndDate,20, imageLocal.getHeight() - 220);
    			g.dispose();
    			
    			// 完成模板修改
    			g.dispose();
    			// 判断新文件的地址路径是否存在,如果不存在就创建一个
    			File outputfile = new File(path+originalFilename);
    			if (!outputfile.getParentFile().exists()) {
    				outputfile.getParentFile().mkdirs();
    			}
    			// 生成新的合成过的用户二维码并写入新图片
    			ImageIO.write(imageLocal, "png", outputfile);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return originalFilename;
    	}
    	
    	/**
    	 * 
    	 * @param c 需要写在背景图上的字符串
    	 * @param g Graphics2D java 合成图片 写字的处理对象
    	 * @return
    	 */
    	public static int getCharLen(char c, Graphics2D g) {
    		return g.getFontMetrics(g.getFont()).charWidth(c)+3;
    	}
     
    	/**
    	 * 获取水印文字总长度
    	 * 
    	 * @paramwaterMarkContent水印的文字
    	 * @paramg
    	 * @return水印文字总长度
    	 */
    	public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
    		return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    	}
     
    }
    
    展开全文
  • Cocos2d-x 3.x游戏开发之旅_完整版PDF电子书

    千次下载 热门讨论 2015-07-30 22:10:10
    Cocos2d-x 3.x游戏开发之旅_完整版PDF电子书 上次传过一个给弄错了 而且我也不知道怎么把上次上传的那个删掉 看清楚 这个才是 完整版
  • 2D激光SLAM 1、2D激光SLAM的介绍 2D激光SLAM的输入 IMU数据 2D激光雷达数据 里程计数据 2D激光SLAM的输出 覆盖栅格地图 机器人的轨迹 or PoseGraph 2D激光SLAM的帧间匹配方法 PI-ICP 梯度优化方法<——hector_...

    2D激光SLAM

    1、2D激光SLAM的介绍
    2D激光SLAM的输入:
    IMU数据
    里程计数据
    2D激光雷达数据
    在这里插入图片描述

    2D激光SLAM的输出:
    覆盖栅格地图
    机器人的轨迹 or PoseGraph
    在这里插入图片描述
    2D激光SLAM的帧间匹配方法:
    PI-ICP
    梯度优化方法<——hector_slam
    CSM(Correlation Scan Match)
    State of Art: CSM+梯度优化

    2D激光SLAM的回环检测方法:
    Scan-to-Map
    Map-to-Map
    Branch and Bound & Lazy Decision

    2、2D激光SLAM的发展——时间
    Filter-based
    EKF-SLAM----90年代
    Gmapping----07
    FastSLAM----02~03
    Optimal RBPF----10
    Graph-based
    Globally Consistent Range Scan For Environment Mapping----97
    Karto SLAM----10
    Incremental Mapping of Large Cyclic Environments----99
    Cartographer----16

    3、2D激光SLAM的应用
    数据的预处理—非常重要!!!
    轮式里程计的标定
    不同系统之间的时间同步
    激光雷达运动畸变去除

    实际环境中的问题:
    动态物体
    环境变化
    几何结构相似环境
    建图的操作复杂
    全局定位
    地面材质的变化
    地面凹凸不平
    机器人载重的改变

    展开全文
  • glTexSubImage2D的使用详解

    千次阅读 2019-11-10 02:25:17
    一、函数介绍 void glTexSubImage2D(GLenum target, ​ GLint level, ​ GLint xoffset, ​ ...

    一、函数介绍

    void glTexSubImage2D(GLenum target,

    ​ GLint level,

    ​ GLint xoffset,

    ​ GLint yoffset,

    ​ GLsizei width,

    ​ GLsizei height,

    ​ GLenum format,

    ​ GLenum type,

    ​ const GLvoid * data);

    参数

    target

    指定活动纹理单元的目标纹理。 必须是GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP_POSITIVE_XGL_TEXTURE_CUBE_MAP_NEGATIVE_XGL_TEXTURE_CUBE_MAP_POSITIVE_YGL_TEXTURE_CUBE_MAP_NEGATIVE_YGL_TEXTURE_CUBE_MAP_POSITIVE_ZGL_TEXTURE_CUBE_MAP_NEGATIVE_Z

    level

    指定详细级别编号。 0级是基本图像级别。 级别n是第n个mipmap缩小图像。

    xoffset

    指定纹理数组中x方向的像素偏移量,x方向是指纹理坐标,即左下角为(0,0)。

    yoffset

    指定纹理数组中y方向的纹素偏移,y方向是指纹理坐标,即左下角为(0,0)。

    width

    指定纹理子图像的像素宽度。

    height

    指定纹理子图像的像素高度。

    format

    指定像素数据的格式。 接受以下符号值:GL_ALPHAGL_RGBGL_RGBAGL_LUMINANCEGL_LUMINANCE_ALPHA

    type

    指定像素数据的数据类型。 接受以下符号值:GL_UNSIGNED_BYTEGL_UNSIGNED_SHORT_5_6_5GL_UNSIGNED_SHORT_4_4_4_4GL_UNSIGNED_SHORT_5_5_5_1

    data

    指定指向内存中图像数据的指针

    注意!!!

    因为纹理坐标的(0,0)点是左下角,所以我们修改纹理数据的时候是从左下角开始绘制的。

    顺序先沿着X轴从左至右,再沿着Y轴从下至上,即一行一行像素的绘制。

    示例代码如下:

            virtual unsigned    loadTexture(const char* fileName)
            {
                unsigned    textureId   =   0;
                //1 获取图片格式
                FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(fileName, 0);
    
                //2 加载图片
                FIBITMAP    *dib = FreeImage_Load(fifmt, fileName,0);
    
                //3 转化为rgb 24色
                dib     =   FreeImage_ConvertTo24Bits(dib);
    
                //4 获取数据指针
                BYTE    *pixels =   (BYTE*)FreeImage_GetBits(dib);
    
                int     width   =   FreeImage_GetWidth(dib);
                int     height  =   FreeImage_GetHeight(dib);
    
    			//windows是BGR模式
    			for (int i =0;i<width*height*3;)
    			{
    				float temp = pixels[i+2];
    				pixels[i + 2] = pixels[i];
    				pixels[i] = temp;
    				i += 3;
    			}
    
                /**
                *   产生一个纹理Id,可以认为是纹理句柄,后面的操作将书用这个纹理id
                */
                glGenTextures( 1, &textureId );
    
                /**
                *   使用这个纹理id,或者叫绑定(关联)
                */
                glBindTexture( GL_TEXTURE_2D, textureId );
                /**
                *   指定纹理的放大,缩小滤波,使用线性方式,即当图片放大的时候插值方式 
                */
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
                
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
                /**
                *   将图片的rgb数据上传给opengl.
                */
                glTexImage2D( 
                    GL_TEXTURE_2D,      //! 指定是二维图片
                    0,                  //! 指定为第一级别,纹理可以做mipmap,即lod,离近的就采用级别大的,远则使用较小的纹理
                    GL_RGB,             //! 纹理的使用的存储格式
                    width,              //! 宽度,老一点的显卡,不支持不规则的纹理,即宽度和高度不是2^n。
                    height,             //! 宽度,老一点的显卡,不支持不规则的纹理,即宽度和高度不是2^n。
                    0,                  //! 是否的边
                    GL_RGB,             //! 数据的格式,bmp中,windows,操作系统中存储的数据是bgr格式
                    GL_UNSIGNED_BYTE,   //! 数据是8bit数据
                    pixels
                    );
    
    
    			char    subData[100 * 100 * 3];
    
    			memset(subData, 255, sizeof(subData));
    			for (int i = 0; i<150;)
    			{
    				subData[i] = 0;
    				subData[++i] = 0;
    				subData[++i] = 255;
    			}
    			glTexSubImage2D(GL_TEXTURE_2D, 0, 100, 50, 100, 100, GL_RGB, GL_UNSIGNED_BYTE, subData);
                /**
                *   释放内存
                */
                FreeImage_Unload(dib);
                return  textureId;
            }
    

    图片修改结果如下:

    在这里插入图片描述

    二、在freetype中应用的时候要注意了!!!

    代码如下

    int _yStart = 0;
    int _xStart = 0;
    	char* readFile(const char* fileName, unsigned& length)
    	{
    		FILE* pFile = fopen(fileName, "rb");
    		if (pFile)
    		{
    			fseek(pFile, 0, SEEK_END);
    			length = ftell(pFile);
    			fseek(pFile, 0, SEEK_SET);
    			char*buffer = new char[length + 1];
    			fread(buffer, 1, length, pFile);
    			buffer[length] = 0;
    			fclose(pFile);
    			return buffer;
    		}
    		else
    		{
    			char buffer[1024];
    			sprintf_s(buffer, "read %s failed", fileName);
    			assert(pFile != 0 && buffer);
    		}
    		return 0;
    	}
    	void buildSystemFont(const char* font,int fontSize)
    	{
    		_uiProgram.initialize();
    
    		unsigned length = 0;
    		_fontBuffer = readFile(font, length);
    
    		/**
    		*   保存字体的大小
    		*/
    		_fontSize = fontSize;
    		/**
    		*   已经创建了字体则销毁
    		*   支持多次调用
    		*/
    		if (_face)
    		{
    			FT_Done_Face(FT_Face(_face));
    			_xStart = 0;
    			_yStart = 0;
    			memset(_character, 0, sizeof(_character));
    		}
    		/**
    		*   销毁字体
    		*/
    		if (_sysFontTexture != -1)
    		{
    			glDeleteTextures(1, &_sysFontTexture);
    		}
    		glGenTextures(1, &_sysFontTexture);
    		/**
    		*   使用这个纹理id,或者叫绑定(关联)
    		*/
    		glBindTexture(GL_TEXTURE_2D, _sysFontTexture);
    		/**
    		*   指定纹理的放大,缩小滤波,使用线性方式,即当图片放大的时候插值方式
    		*/
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    		glTexImage2D(
    			GL_TEXTURE_2D, 
    			0, 
    			GL_ALPHA, 
    			_textureWidth,
    			_textureHeight, 
    			0, 
    			GL_ALPHA, 
    			GL_UNSIGNED_BYTE, 
    			0
    			);
    
    		FT_Error error = FT_New_Memory_Face((FT_Library)_library,(const FT_Byte*)_fontBuffer,length,0,&(FT_Face)_face);
    		if (error != 0)
    		{
    			return;
    		}
    		FT_Face ftFace = (FT_Face)_face;
    		FT_Select_Charmap(ftFace, FT_ENCODING_UNICODE);
    		FT_F26Dot6 ftSize = (FT_F26Dot6)(fontSize * (1 << 6));
    
    		FT_Set_Char_Size((FT_Face)_face, ftSize, 0, 72, 72);
    
    		assert(_face != 0);
    
    	}
    
    Character getCharacter(wchar_t ch)
    	{
    		if (_character[ch].x0 == 0 &&
    			_character[ch].x0 == 0 &&
    			_character[ch].x1 == 0 &&
    			_character[ch].y1 == 0
    			)
    		{
    			glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    
    			if (_xStart + max(_fontPixelX, _fontSize) > _textureWidth)
    			{
    				/**
    				*   写满一行,从新开始
    				*/
    				_xStart = 0;
    				/**
    				*   y开始位置要增加
    				*/
    				_yStart += max(_fontPixelY, _fontSize);
    			}
    			FT_Load_Glyph(_face, FT_Get_Char_Index(_face, ch), FT_LOAD_DEFAULT);
    			FT_Glyph glyph;
    			FT_Get_Glyph(FT_Face(_face)->glyph, &glyph);
    			/**
    			*   根据字体的大小决定是否使用反锯齿绘制模式
    			*   当字体比较小的是说建议使用ft_render_mode_mono
    			*   当字体比较大的情况下12以上,建议使用ft_render_mode_normal模式
    			*/
    			if (!(ch >= L'0' && ch <= L'9'))
    			{
    				FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, 0, 1);
    			}
    			else
    			{
    				FT_Glyph_To_Bitmap(&glyph, ft_render_mode_mono, 0, 1);
    			}
    			FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph;
    			FT_Bitmap& bitmap = bitmap_glyph->bitmap;
    			FT_Bitmap ftBitmap;
    			FT_Bitmap_New(&ftBitmap);
    
    			if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO)
    			{
    				if (FT_Bitmap_Convert((FT_Library)_library, &bitmap, &ftBitmap, 1) == 0)
    				{
    					/**
    					*   Go through the bitmap and convert all of the nonzero values to 0xFF (white).
    					*/
    					for (unsigned char* p = ftBitmap.buffer, *endP = p + ftBitmap.width * ftBitmap.rows; p != endP; ++p)
    						*p ^= -*p ^ *p;
    					bitmap = ftBitmap;
    				}
    			}
    			/**
    			*   如果没有数据,则不写,直接过去
    			*/
    			if (bitmap.width == 0 || bitmap.rows == 0)
    			{
    
    				char    mem[1024 * 32];
    				memset(mem, 0, sizeof(mem));
                    
    				_character[ch].x0 = _xStart;
    				_character[ch].y0 = _yStart;
    				_character[ch].x1 = _xStart + _fontSize / 2;
    				_character[ch].y1 = _yStart + _fontSize - 1;
    				_character[ch].offsetY = _fontSize - 1;
    				_character[ch].offsetX = 0;
    
    				glBindTexture(GL_TEXTURE_2D, _sysFontTexture);
    
    				glTexSubImage2D(
    					GL_TEXTURE_2D,
    					0,
    					_xStart,
    					_yStart,
    					_fontSize / 2,
    					_fontSize,
    					GL_ALPHA,
    					GL_UNSIGNED_BYTE,
    					mem
    				);
    				_xStart += _fontSize / 2;
    
    			}
    			else
    			{
    				glBindTexture(GL_TEXTURE_2D, _sysFontTexture);
    
    				_character[ch].x0 = _xStart;
    				_character[ch].y0 = _yStart;
    				_character[ch].x1 = _xStart + bitmap.width;
    				_character[ch].y1 = _yStart + bitmap.rows;
    
    				_character[ch].offsetY = bitmap_glyph->top;
    				_character[ch].offsetX = bitmap_glyph->left;
    
    				glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    				glTexSubImage2D(
    					GL_TEXTURE_2D,
    					0,
    					_xStart,
    					_yStart,
    					max(1, bitmap.width),
    					max(1, bitmap.rows),
    					GL_ALPHA,
    					GL_UNSIGNED_BYTE,
    					bitmap.buffer
    				);
    				_xStart += (bitmap.width + 1);
    				_fontPixelY = max(_fontPixelY, bitmap.rows);
    				_fontPixelX = max(_fontPixelX, bitmap.width);
    			}
    
    			FT_Bitmap_Done((FT_Library)_library, &ftBitmap);
    		}
    		return  _character[ch];
    	}
    

    主要的内容在getCharacter函数,将字库里的数据,通过glTexSubImage2D贴到我们自己的纹理上。

    但由于glTexSubImage2D绘制的特性(从下往上),所以我们的字是倒过来的。

    在这里插入图片描述

    我们再使用该纹理写字的时候务必注意倒过来

    展开全文
  • cocos2d-html5-v2.2.3.zip

    热门讨论 2014-05-23 09:25:47
    cocos2d-html5最新开发包,支持js快速开发,适合想转型做游戏的同学。
  • cocos2d-x游戏开发之旅 源代码

    热门讨论 2015-03-16 15:09:42
    有4个分卷 cocos2d-x游戏开发之旅 源代码1 方便大家学习
  • unity2D制作一个2D游戏场景Tilemap

    千次阅读 2021-04-06 17:29:09
    做一个2D的游戏场景。由于公司软件一直停留在5.X时代,很多新版本功能并没有用到。这次用了新版本,感觉发现了新大陆了。 目的:做一个2D的游戏场景。使用的是2020.3.0f1版本。 方法:使用Tilemap功能。 过程如下...

    今天使用了一下2020版本的unity。做一个2D的游戏场景。由于公司软件一直停留在5.X时代,很多新版本功能并没有用到。这次用了新版本,感觉发现了新大陆了。

    目的:做一个2D的游戏场景。使用的是2020.3.0f1版本。

    方法:使用Tilemap功能。

    过程如下:更多内容请关注:unity风雨路

    首先新建一个新工程,最初选择2D的项目。然后新建一个2D场景。

     

    然后到Hierarchy面板里2D Object---Tilemap--Rectangular。最后这几项选择意思是分别建造不同的网格。

     

     

    如果使用第一个规则的那就是方格的如图:

    现在所能看到的网格就是用来制作2D场景的。之后只需要将场景中对应的sprite画进去就可以了。

    那么如何画进去。必须要有Tile palette。在window--2d--Tile Palette里。如下:

     

     

    打开之后新建一个palette,如下,接下来只需要将对应的sprite图片拖进去就可以。

     

     

    例如我拖进去一个背景。然后点击笔刷按钮,再将笔刷移动到scene视图里,会看到这个背景就被画进了scene里。

    之后我们在新建一个Tilemap用来放置可交互的场景物体。例如道路、桥梁等等。

    同样的再拖一个sprite进入画板里。这是一个桥的图像。

     

    然后选择新建的Tilemap这个层。再次点击笔刷把新图像画进去。拖动笔刷会刷出很多物体在网格里。如果画多或者画错了可以点击橡皮工具擦掉也可以选择画笔然后按住shif+左键取消。和制作地形的操作方法是一样的。如下图:

    然后给场景里的交互物体加碰撞

    因为新的Tilemap这个层也就是Tilemap(1)这个是用来交互的物体。所以直接给他添加Tilemap collider2d的组件。这样就已经实现了碰撞功能。

     

    我们测试一下,在2D OBJECT--Physics--dynamic sprite里新建一个动态的sprite。这个新建的物体是自动带刚体和碰撞的,也就是可以测试碰撞的。

     

    然后选择个颜色为了测试看得效果明显。此处案例为红色。如图:

    运行效果如图:

    很明显有了碰撞效果。但是这个碰撞是针对真个层的。如果要有很细化的物体碰撞可以继续添加Composite collider2d这个时候会自动给层添加一个RIgidbody2d,但注意要修改BODY TYPE为静态,如图:

    同时还要勾选上TIlemap collider2d的used by composite选择项,这样就会让碰撞更加精细,也就是只针对于该层的具体有形状的物体增加碰撞而不是整个层。

     

    这样就实现了场景的快速搭建方法。想要添加任何的场景物体都可以使用该方法。比起手动一个个摆放物体方便多了。

    展开全文
  • 《Cocos2d-Js开发之旅-从HTML5到原生手机游戏》源码
  • DepthwiseConv2D和Conv2D详解

    千次阅读 多人点赞 2020-08-17 15:52:49
    depthwise_conv2d和conv2d的不同之处在于conv2d在每一深度上卷积,然后求和,depthwise_conv2d卷积,不求和。 [https://www.cnblogs.com/itmorn/p/11250371.html] depthwise_conv2d 如下张量x和卷积核K进行depthwise...
  • cocos2d-x-2.1.5

    2013-10-11 08:13:32
    cocos2d-x-2.1.5
  • 2D格斗游戏,C语言实现

    千次下载 热门讨论 2013-11-16 13:21:15
    一个类似于《热血格斗》的2D格斗游戏,使用C语言实现,内附源代码。
  • torch.nn.MaxPool2d详解

    万次阅读 多人点赞 2020-11-22 20:18:38
    _) class MaxPool2d(_MaxPoolNd): kernel_size: _size_2_t stride: _size_2_t padding: _size_2_t dilation: _size_2_t def forward(self, input: Tensor) -> Tensor: return F.max_pool2d(input, self.kernel_size,...
  • keras:Convolution2D与Conv2D

    千次阅读 2020-07-08 11:18:05
    区别:Convolution2D = Conv2D 参考来源:源文件 github.keras.layder.convolutional # Aliases Convolution1D = Conv1D Convolution2D = Conv2D Convolution3D = Conv3D SeparableConvolution1D = SeparableConv1D ...
  • Unity 2D光照(2D Light)和阴影(Shadow Caster 2D

    千次阅读 多人点赞 2020-03-25 18:11:21
    2d animation https://docs.unity3d.com/Packages/com.unity.2d.animation@3.1/manual/index.html 2d场景的光照效果 https://www.youtube.com/watch?v=F5l8vP90EvU
  • cocos2d-x-2.2.6

    千次下载 热门讨论 2015-03-07 08:52:30
    part7:http://download.csdn.net/detail/wsppabb/8479855
  • 1、零填充ZeroPad2d 2、常数填充ConstantPad2d 3、镜像填充ReflectionPad2d 4、重复填充ReplicationPad2d 卷积操作作为卷积神经网络的核心模块,在其计算过程中必须考虑图像“边缘像素”的卷积方式。我们可以...
  • cocos2d-x 3d模型显示

    热门讨论 2013-06-13 20:43:02
    cocos2d-x 3d模型显示. 部分代码。 cocos2d-x 3d模型显示. 部分代码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 722,981
精华内容 289,192
关键字:

2d