【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(2)!
前言-
明确了项目目录的结构,但是结构什么的也太"抽象"了。
本篇开始上代码!
模型的绘制-
前几天的学习中,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)!的更多相关文章
- 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(1)!
前言- 上几篇文章,我们一个一个的研究了Cubism官方提供的Android使用Live2D的简单例子,但是依旧和大家平时见到的还是有很大差距的.在研究了代码差不多一周以后,我决定还是用文字的形式记录 ...
- 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(4)!
前言- 这是最后一个重要的类了——LAppLive2DManager,流程什么的也清晰了,话不多说我们来康康吧! LAppLive2DManager- public class LAppLive2DM ...
- 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(3)!
---恢复内容开始--- 前言- 虽然上文说的是model的绘制但是这个说法并不严谨,之前的几个例子都会有模型文件的读入和载入,可是在LAppRenderer.LAppView中并没有.moc等文件的 ...
- Android源码学习之装饰模式应用
首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...
- Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...
- [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法
博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...
- Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令
Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...
- Android源码-学习随笔
在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...
- Android源码学习之模板方法模式应用
一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...
随机推荐
- Python爬虫入门教程 60-100 python识别验证码,阿里、腾讯、百度、聚合数据等大公司都这么干
常见验证码 之前的博客中已经解决了一些常见验证码的问题,但是验证码是层出不穷的,目前解决验证码除了通过常规手段解决以外,还可以通过人工智能领域的深度学习去解决 深度学习?! 无疑对爬虫coder提高了 ...
- 8天入门docker系列 —— 第二天 通过一个aspnetcore程序加深对容器的理解
我们知道容器是一个打包了应用和相关依赖的盒子,那怎么去操控这个盒子呢? 这一篇我通过一个简单的aspnetcore程序来加深对盒子的理解,使用之前先 安装一下Docker的环境. 一:Docker的安 ...
- xss攻击和csrf攻击的定义及区别
1.CSRF的基本概念.缩写.全称 CSRF(Cross-site request forgery):跨站请求伪造. PS:中文名一定要记住.英文全称,如果记不住也拉倒. 2.CSRF的攻击原理 用户 ...
- 关于页面传参,decodeURI和decodeURIComponent
之前写过一个关于页面传参的,但是是前端相对于自己的页面做的跳转,也就是页面1,跳转到页面2,里面带的参数.这里可以参考我上一篇文章,包括里面参数中如果有数组和json格式的情况.但是需要注意的是,我前 ...
- Linux stat函数和stat命令
stat函数和stat命令 linux文件里的[inode = index node]解释:要理解inode必须了解磁盘和[目录项],inode实际是连接[目录项]和磁盘的中间物质. 图里的大圈代表硬 ...
- windows系统中,在当前目录下打开cmd命令行的两种方法
1.在当前路径地址栏中直接输入‘cmd’,然后回车. 2.在当前路径下,按住‘shift’键同时点击鼠标右键,点击“在此处打开Powershell”. 其实你会发现,两个命令行有很大的区别. cmd: ...
- windows防火墙实验-命令行设置远程桌面连接以及禁止浏览器上网
windows防火墙实验-设置远程桌面连接以及禁止浏览器上网 实验环境: 1.win2008远程桌面服务 2.win7-1 10.10.10.136 3.win7-2 10.10.10.153 实验步 ...
- Java对象引用/JVM分级引用——强引用、软引用、弱引用、虚引用
无论是通过引用计数法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判断对象是否存活都与“引用”有关, 相关资料:如何判断对象是否存活/死去 那么引用究竟是什么?让我们一起来看一下 ...
- 在docker私有仓库如何查看有哪些镜像?
搭建了docker私有仓库,上传了一些镜像,时间长了就会忘了有哪些镜像,在网上查了,有大佬是通过脚本查看的,多厉害! #!/usr/bin/env python#-*- coding:utf-8 -* ...
- 使用正则替换script及其内容
因做微信公众号文章保存,发现他的js大多数也用不着,所以就想着用正则替换掉源代码中的js片段 正则代码: <script(?:[^<]++|<(?!/script>))*+&l ...