windows 查看工具下载
http://www.geocities.jp/higuchuu4/index_e.htm
http://kkhk22.seesaa.net/category/14045227-1.html
官网(介绍了mmd文件格式,以及mmd模型)
http://mikumikudance.wikia.com/wiki/Category:MMD_Models
http://mikumikudance.wikia.com/wiki/MMD:Polygon_Model_Data
http://mikumikudance.wikia.com/wiki/VMD_file_format
(MMD相关开源代码) https://learnopengl.com/
https://www6.atwiki.jp/vpvpwiki/pages/288.html
https://bitbucket.org/nyan_developer/nya-engine/overview
opengl学习相关博客
http://moddb.wikia.com/wiki/OpenGL:Tutorials:Basic_Bones_System
http://www.wazim.com/Collada_Tutorial_2.htm
https://blog.jayway.com/2013/05/09/opengl-es-2-0-tutorial-for-android-part-i-getting-started/ http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/
toon 渲染法(卡通渲染法)
int[] buf = new int[1];
GLES20.glGenBuffers(1, buf, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buf[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, bufMikuPos.capacity() * 4, bufMikuPos, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
bufPos = buf[0];
buf = new int[1];
GLES20.glGenBuffers(1, buf, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buf[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, bufMikuNormal.capacity() * 4, bufMikuNormal, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
bufNormal = buf[0];
buf = new int[1];
GLES20.glGenBuffers(1, buf, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buf[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, bufMikuColor.capacity() * 4, bufMikuColor, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
bufColor = buf[0];
indexBuf = new int[1];
GLES20.glGenBuffers(1, indexBuf, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuf[0]);
GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexMikuBuf.capacity() * 4, indexMikuBuf, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufPos);
GLES20.glVertexAttribPointer(a_Position, 3, GLES20.GL_FLOAT, false, 3 * 4, 0);
GLES20.glEnableVertexAttribArray(a_Position);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufNormal);
GLES20.glVertexAttribPointer(a_Normal, 3, GLES20.GL_FLOAT, false, 3 * 4, 0);
GLES20.glEnableVertexAttribArray(a_Normal);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufColor);
GLES20.glVertexAttribPointer(a_Color, 4, GLES20.GL_FLOAT, false, 4 * 4, 0);
GLES20.glEnableVertexAttribArray(a_Color);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuf[0]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexMikuBuf.capacity(), GLES20.GL_UNSIGNED_INT, 0);
如果使用了pointer 就不需要bind 了ElementArrayBuffer
gles2.DrawElements
vmd相关
1. 将骨头的位置移动到原点(position)
2. 使用动作的旋转数据(rotation)进行旋转
3. 在将骨头位置加回来(position)
4. 加上动作的位移数据(location)
经过旋转移动后,骨头的位置也有了变化。需要重新计算骨头的位置。
# x = kf + b
def calcuMidFrame(x1, x2, f1, f2, f):
k = (x2 - x1) / (f2 - f1)
b = x1 - (f1*x2 - f1*x1) / (f2 - f1)
return k*f+b