前言-

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

本篇开始上代码!

模型的绘制-

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

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

LAppRenderer implements GLSurfaceView.Renderer
LAppView extends GLSurfaceView

渲染器类LAppRenderer -

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

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

绘制

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

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

 //LAppLive2DManager

 public void onSurfaceChanged(GL10 gl, int width, int height){
if(LAppDefine.DEBUG_LOG)Log.d(TAG, "onSurfaceChanged "+width+" "+height);
view.setupView(width,height); if(getModelNum()==0){
changeModel();
}
}

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

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

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()方法中

 public void setLive2DManager( LAppLive2DManager live2DMgr){
this.delegate = live2DMgr ;
this.renderer = new LAppRenderer( live2DMgr ) ; setRenderer(renderer); gestureDetector = new GestureDetector(this.getContext() , simpleOnGestureListener ) ; deviceToScreen=new L2DMatrix44(); viewMatrix=new L2DViewMatrix(); viewMatrix.setMaxScale( LAppDefine.VIEW_MAX_SCALE );
viewMatrix.setMinScale( LAppDefine.VIEW_MIN_SCALE ); viewMatrix.setMaxScreenRect(
LAppDefine.VIEW_LOGICAL_MAX_LEFT,
LAppDefine.VIEW_LOGICAL_MAX_RIGHT,
LAppDefine.VIEW_LOGICAL_MAX_BOTTOM,
LAppDefine.VIEW_LOGICAL_MAX_TOP
); touchMgr=new TouchManager(); dragMgr = new L2DTargetPoint();
}

setLive2DManager

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

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

 
												

【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. 粮草先行——Android折叠屏开发技术点(二)

    继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...

  2. 4.JAVA-数组、String详解

    1.数组 public class Test{ public static void main(String args[]){ int[] intArray = new int[] {1,4,3,2, ...

  3. Java虚拟机三:OutOfMemoryError异常分析

    根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例 ...

  4. 前端基础之--css中可被继承和不可被继承的属性

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性:vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shado ...

  5. JavaScript函数定义 ,参数调用

    一.JavaScript函数函数: 函数就是一种封装,由事件驱动的或者当它被调用时执行的可重复使用的代码块.定义函数:function 函数名(){函数体;}数不会自动执行,需要被调用才可以执行函数名 ...

  6. SQL Server统计信息偏差影响表联结方式案例浅析

      我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适的例子上,所以一直拖着没有写.巧合,最近在生产环境中遇到 ...

  7. apache kafka & CDH kafka源码编译

    Apache kafka编译 前言 github网站kafka项目的README.md有关于kafka源码编译的说明 github地址:https://github.com/apache/kafka ...

  8. ubuntu修改键盘映射

    code {margin: 0;padding: 0;font-size: 100%;word-break: normal;background: transparent;border: 0;}ol ...

  9. .Net MVC+NPOI实现下载自定义的Word文档

    我们浏览很多网站时都会看到下载文件的功能(图片.word文档等),好巧不巧的是贫道近日也遇到了这个问题,于是写一篇博客记录一下. 技术点:MVC.NPOI.Form表单. 具体如何实现,待贫道喝一口水 ...

  10. 查看网卡及对应的IP、MAC

    #!/bin/bash# judge OS OS_release=`cat /etc/redhat-release | awk '{print $(NF-1)}'|cut -c 1`# To obta ...