前言-

明确了项目目录的结构,但是结构什么的也太"抽象"了。

本篇开始上代码!

模型的绘制-

前几天的学习中,live2d的绘制有了一些了解了,在Android端使用OpenGL ES绘制模型时需要Surface绘制和Renderer渲染,那么切入点就为GLSurfaceView和Renderer。

在SampleApp1中的sample包下LAppView和LAppRenderer就分别饰演的这两个角色

  1. LAppRenderer implements GLSurfaceView.Renderer
  2. LAppView extends GLSurfaceView

渲染器类LAppRenderer -

LAppRenderer 类实现了Renderer接口,实现了onSurfaceCreated、onSurfaceChanged、onDrawFrame方法

  1. @Override
  2. public void onSurfaceCreated(GL10 context, EGLConfig arg1) {
  3. setupBackground(context);
  4. }
  5.  
  6. //设置背景图片
  7. private void setupBackground(GL10 context) {
  8. try {
  9. InputStream in = FileManager.open(LAppDefine.BACK_IMAGE_NAME);
  10. bg=new SimpleImage(context,in);
  11.  
  12. bg.setDrawRect(
  13. LAppDefine.VIEW_LOGICAL_MAX_LEFT,
  14. LAppDefine.VIEW_LOGICAL_MAX_RIGHT,
  15. LAppDefine.VIEW_LOGICAL_MAX_BOTTOM,
  16. LAppDefine.VIEW_LOGICAL_MAX_TOP);
  17. bg.setUVRect(0.0f,1.0f,0.0f,1.0f);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  1. onSurfaceCreated()作为surface被创建后需要做的处理,但是这里只加载了背景图片
    onDrawFrame()方法中有很多的OpenGL绘制时的配置,由于LAppLive2DManagerUtils的存在很多操作都不在这里实现了,这里还是很明显的绘制出了backgroundmodels,方法还是熟悉的方法,只是藏了起来
  1. if(bg!=null){
  2. gl.glPushMatrix() ;
  3. {
  4. float SCALE_X = 0.25f ;
  5. float SCALE_Y = 0.1f ;
  6. gl.glTranslatef( -SCALE_X * accelX , SCALE_Y * accelY , 0 ) ;
  7.  
  8. bg.draw(gl);
  9. }
  10. gl.glPopMatrix() ;
  11. }
  12.  
  13. for(int i=0;i<delegate.getModelNum();i++)
  14. {
  15. LAppModel model = delegate.getModel(i);
  16. if(model.isInitialized() && ! model.isUpdating())
  17. {
  18. model.update();
  19. model.draw(gl);
  20. }
  21. }

绘制

而onSurfaceChanged方法的实现就非常interesting了,因为在Manager中也有一个同样的方法

而且在onSurfaceChanged()的第一行就调用了此方法

  1. //LAppLive2DManager
  2.  
  3. public void onSurfaceChanged(GL10 gl, int width, int height){
  4. if(LAppDefine.DEBUG_LOG)Log.d(TAG, "onSurfaceChanged "+width+" "+height);
  5. view.setupView(width,height);
  6.  
  7. if(getModelNum()==0){
  8. changeModel();
  9. }
  10. }

***这是为了实现点击左下角按钮更换模型这个功能的,当没有模型的时候会把一个reloadFlg的Flag置为true,通过点击事件达到模型的更换。

同样的onSurfaceChanged中也存在着大量的OpenGL的配置,在最后的最后有这麽一行代码

  1. OffscreenImage.createFrameBuffer(gl, width ,height, 0);

这里挖一个小小的坑,我查了半天说是离屏渲染(OffScreen Renderer),同样也单独存在OffscreenImage来实现此功能,但是我还没有搞懂

与这个相同的还有一个setAccel()方法的作用没有弄明白

=====================================================================================================================================================================================================

绘制类LAppView -

这是LAppView类的类图

相信从上图中可以看出很多属性和方法都是干什么的比如:

-GestureDetector gestureDetector是Android中的手势动作

-onTouchEvent() 则是触摸事件,还有很多的Began啊、Moved啊和utils中的TouchManage共同来获得触摸的点

而上面把Renderer写好了,但是还记得Renderer怎么画到Surface上面么?没错是setRenderer( renderer ) !这一行代码躺在setLive2DManager()方法中

  1. public void setLive2DManager( LAppLive2DManager live2DMgr){
  2. this.delegate = live2DMgr ;
  3. this.renderer = new LAppRenderer( live2DMgr ) ;
  4.  
  5. setRenderer(renderer);
  6.  
  7. gestureDetector = new GestureDetector(this.getContext() , simpleOnGestureListener ) ;
  8.  
  9. deviceToScreen=new L2DMatrix44();
  10.  
  11. viewMatrix=new L2DViewMatrix();
  12.  
  13. viewMatrix.setMaxScale( LAppDefine.VIEW_MAX_SCALE );
  14. viewMatrix.setMinScale( LAppDefine.VIEW_MIN_SCALE );
  15.  
  16. viewMatrix.setMaxScreenRect(
  17. LAppDefine.VIEW_LOGICAL_MAX_LEFT,
  18. LAppDefine.VIEW_LOGICAL_MAX_RIGHT,
  19. LAppDefine.VIEW_LOGICAL_MAX_BOTTOM,
  20. LAppDefine.VIEW_LOGICAL_MAX_TOP
  21. );
  22.  
  23. touchMgr=new TouchManager();
  24.  
  25. dragMgr = new L2DTargetPoint();
  26. }

setLive2DManager

其中为手势gestureDetector绑定了一个监听器simpleOnGestureListener

-setupView()则是一些数值的运算,尤其是那个ratio是不是感觉很熟悉,熟悉去看simple项目的onSurfaceChanged方法中glOrthof第三个参数

  1.  
  1.  

【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(2)!的更多相关文章

  1. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(1)!

    前言- 上几篇文章,我们一个一个的研究了Cubism官方提供的Android使用Live2D的简单例子,但是依旧和大家平时见到的还是有很大差距的.在研究了代码差不多一周以后,我决定还是用文字的形式记录 ...

  2. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(4)!

    前言- 这是最后一个重要的类了——LAppLive2DManager,流程什么的也清晰了,话不多说我们来康康吧! LAppLive2DManager- public class LAppLive2DM ...

  3. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(3)!

    ---恢复内容开始--- 前言- 虽然上文说的是model的绘制但是这个说法并不严谨,之前的几个例子都会有模型文件的读入和载入,可是在LAppRenderer.LAppView中并没有.moc等文件的 ...

  4. Android源码学习之装饰模式应用

    首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...

  5. Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习

    package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...

  6. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  7. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  8. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

  9. Android源码学习之模板方法模式应用

    一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...

随机推荐

  1. SpringBoot进阶教程(二十八)整合Redis事物

    Redis默认情况下,事务支持被禁用,必须通过设置setEnableTransactionSupport(true)为使用中的每个redistplate显式启用.这样做会强制将当前重新连接绑定到触发m ...

  2. Android版数据结构与算法(三):基于链表的实现LinkedList源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. LinkedList 是一个双向链表.它可以被当作堆栈.队列或双端队列进行操作.LinkedList相对于ArrayList来说,添加,删除元素效 ...

  3. Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...

  4. vue + element + 初始化项目

    前提:已经安装了好了npm 和 vue脚手架 注意: 进入想要放置项目的目录下. 1.vue init webpack sun-vue-element 2.根据提示输入 y/n 3.npm run d ...

  5. 关于RecyclerView嵌套导致item复用异常,界面异常的问题

    常规需求: 外层RecyclerView嵌套内层RecyclerView , 在上下滑动的时候会出现item数据以及view的显示异常. 解决办法: 1.重写  getItemViewType  方法 ...

  6. DataPipeline加入Linux基金会下OpenMessaging社区

    近日,国内领先的“iPaaS+AI”一站式大数据融合服务提供商DataPipeline宣布加入Linux基金会旗下OpenMessaging开源社区,将与OpenMessaging开源社区其他成员阿里 ...

  7. 量化投资技术分析工具---ipython使用

    量化投资实际上就是分析数据从而做出决策的过程python数据处理相关模块NumPy:数组批量计算pandas:灵活的表计算Matplotlib:数据可视化 学习目标:用NumPy+pandas+Mat ...

  8. pyquery 学习

    pyquery 是python仿照jQuery的严格实现,语法与jQuery几乎完全相同,所以对于学过前端的朋友们可以立马上手,没学过的小朋友也别灰心,我们马上就能了解到pyquery的强大. 1 安 ...

  9. 【RL-TCPnet网络教程】第40章 RL-TCPnet之TFTP客户端(精简版)

    第40章      RL-TCPnet之TFTP客户端 本章节为大家讲解RL-TCPnet的TFTP客户端应用,学习本章节前,务必要优先学习第38章的TFTP基础知识.有了这些基础知识之后,再搞本章节 ...

  10. DuelJS 介绍

    DuelJS 是什么? DuelJS是一个快速和小型的JavaScript库,可以帮助实现浏览器tab页主从关系的切换.使用它可以优化你浏览器和服务器之间的通信,以及你浏览器内部tab页之间的通信. ...