我正在网格中旋转骨架的骨骼,以获得低聚3D图形.在顶点着色器上它的应用就像这样.
GLSL:
vec4 vert1 = (bone_matrix[index1]*vertex_in)*weight;
vec4 vert2 = (bone_matrix[index2]*vertex_in)*(1-weight);
gl_Position = vert1+vert2;
Run Code Online (Sandbox Code Playgroud)
bone_matrix[index1]是一个骨骼的矩阵,是另一个骨骼bone_matrix[index2]的矩阵. weight指定vertex_in这些骨头的成员资格.问题是重量越接近.5,当施加旋转时,肘部的直径越大.我用大约10,000个顶点圆柱形状(带有梯度的重量)对它进行了测试.结果看起来像弯曲花园软管.
我从这些来源获得了加权方法.它实际上是我能找到的唯一方式:
http://www.opengl.org/wiki/Skeletal_Animation
http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html
http://blenderecia.orgfree.com /blender/skinning_proposal.pdf

左边是形状如何开始,中间是上面方程如何旋转它,右边是我的目标.中间点是加权的0.5.弯曲度越大越好,180度直径为零.
因此,考虑到我可能没有考虑的选项或其他选项,其他人如何避免这种捏合效应?
编辑: 我已经使用四元数工作SLERP,但我选择不使用它,因为GLSL本身不支持它.我不能像汤姆所描述的那样让几何SLERP工作.我让NLERP在前90度工作,所以我在每个关节之间增加了一个"骨头".因此,为了将前臂弯曲40度,我将肘部和前臂各弯曲20度.这消除了挤压效应,代价是加倍骨量,这不是理想的解决方案.
如果我有一个人体三维模型,我想要为行走动画制作,那么实现这一目标的最佳方法是什么?以下是我看到实现此方法的可能方法:
混音器系统是在r73中引入的,从那以后我一直在尝试将我的游戏更新到这个新系统.
除了一件事,我几乎都在那里.某些具有某些几何形状的动画的交叉渐变有一点延迟,这在r72中是不存在的.我攻击了r72的BlendCharacter和Animation功能以允许回调并且效果很好.在73中,如果通过事件触发器内置了此功能,则不需要这样做.
在下面的小提琴中,一切都按预期工作(r72).
http://jsfiddle.net/titansoftime/a93w5hw0/
<script src="http://www.titansoftime.com/webgl/Three72.full.js"></script>
<script src="http://www.titansoftime.com/webgl/BlendCharacter2.js"></script>
<script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/loaders/DDSLoader.js"></script>
var scene, camera, renderer, ambient, directional;
var mesh, geoCache={};
var clock, jsLoader, ddsLoader;
init();
animate();
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.z = 20;
camera.position.y = 10;
ambient = new THREE.AmbientLight(0xffffff);
scene.add(ambient);
directional = new THREE.DirectionalLight(0xffffff,1);
directional.position.set(1,1,0);
scene.add(directional);
clock = new THREE.Clock();
jsLoader = new THREE.JSONLoader(true);
ddsLoader = new THREE.DDSLoader();
renderer = new THREE.WebGLRenderer({antialias:true});
renderer.setSize( window.innerWidth, window.innerHeight ); …Run Code Online (Sandbox Code Playgroud) 我目前正在研究three.js中的骨骼动画测试.我有一个简单的模型,在搅拌机中动画很好.基本上它由三个堆叠的弯曲立方体组成.
当我使用带有Blender V2.64的blender导出插件将blender文件导出到three.js时,webGl上下文中的动画看起来不同,就好像匀称是错误的一样.

WebGL演示:http: //rainbowrangers.de/threejs/animation_test01/
Blender-File:http: //rainbowrangers.de/threejs/animation_test01/model/animation_test01.blend
我需要做些什么才能在three.js中获得正确的结果?
我正在尝试为我的程序添加动画.
我在Blender中使用骨骼动画创建了人体模型,我可以跳过关键帧来查看模型行走.
现在我已经将模型导出为XML(Ogre3D)格式,在这个XML文件中,我可以看到在特定时间分配给每个骨骼的旋转,平移和比例(t = 0.00000,t = 0.00040,...等.)
我所做的是找到为每个骨骼分配的顶点.现在我假设我需要做的就是将为骨骼定义的变换应用于这些顶点中的每一个.这是正确的方法吗?
在我的OpenGL draw()函数(粗伪伪代码)中:
for (Bone b : bones){
gl.glLoadIdentity();
List<Vertex> v= b.getVertices();
rotation = b.getRotation();
translation = b.getTranslation();
scale = b.getScale();
gl.glTranslatef(translation);
gl.glRotatef(rotation);
gl.glScalef(scale);
gl.glDrawElements(v);
}
Run Code Online (Sandbox Code Playgroud) 我必须为移动平台启动3D项目.首先,我想概述主要目标 - 骨骼动画.至于解决方案,我正在考虑使用OpenGL ES和C++.所以问题是:
你可能已经得到了它 - 我还没有为移动平台编程.因此,欢迎提出一些一般性建议.
所以我正在使用2D骨骼动画系统.
有X个骨骼,每个骨骼至少有一个部分(一个四边形,两个三角形).平均而言,我可能有20块骨头,30块.大多数骨骼依赖于父母,骨骼将每帧移动.每个动画总共有1000帧,我使用了大约50个动画.任何时候内存中总共加载大约50,000帧.这些部分在骨架的实例之间有所不同.
我采用的第一种方法是计算每个骨骼的位置/旋转,并为每个部分构建一个由此组成的顶点数组:
[x1,y1,u1,v1],[x2,y2,u2,v2],[x3,y3,u3,v3],[x4,y4,u4,v4]
Run Code Online (Sandbox Code Playgroud)
并通过每帧传递给glDrawElements.
看起来很好,涵盖了我需要的所有场景,不会占用太多内存,但却像狗一样表现.在iPod 4上,可能会获得15fps,其中10个骨架被渲染.
我发现大部分性能都是通过每帧复制如此多的顶点数据来消耗掉的.我决定转到另一个极端,并"预先计算"动画,在每个角色的开头建立一个顶点缓冲区,其中包含每个帧的xyuv坐标,每个部分都在一个字符中.然后,我计算应该用于特定时间的帧的索引,并计算增量值,该增量值被传递到用于在当前帧和下一帧XY位置之间进行插值的着色器.
每帧的顶点看起来像这样
[--------------------- Frame 1 ---------------------],[------- Frame 2 ------]
[x1,y1,u1,v1,boneIndex],[x2, ...],[x3, ...],[x4, ...],[x1, ...][x2, ...][....]
Run Code Online (Sandbox Code Playgroud)
顶点着色器如下所示:
attribute vec4 a_position;
attribute vec4 a_nextPosition;
attribute vec2 a_texCoords;
attribute float a_boneIndex;
uniform mat4 u_projectionViewMatrix;
uniform float u_boneAlpha[255];
varying vec2 v_texCoords;
void main() {
float alpha = u_boneAlpha[int(a_boneIndex)];
vec4 position = mix(a_position, a_nextPosition, alpha);
gl_Position = u_projectionViewMatrix * position;
v_texCoords = a_texCoords;
}
Run Code Online (Sandbox Code Playgroud)
现在,性能非常好,其中10个在屏幕上,它可以舒适地以50fps的速度运行.但现在,它使用了一公吨的内存.我已经通过在xyuv上失去一些精确度来优化它,现在这些精确度很高.
还存在骨依赖性丢失的问题.如果有两个骨骼,父母和孩子,并且孩子的关键帧为0s和2s,则父级的关键帧为0s,0.5s,1.5s,2s,则子项不会在0.5s和0.5s之间更改. 1.5s应该如此.
我想出了一个解决方案来解决这个骨骼问题 - 通过强迫孩子在与父母相同的点上拥有关键帧.但是这会占用更多内存,并且基本上会杀死骨骼层次结构.
这就是我现在所处的位置.我试图在性能和内存使用之间找到平衡点.我知道这里有很多冗余信息(特定部分的所有帧的UV坐标都是相同的,所以重复约30次).并且必须为每组零件创建一个新的缓冲区(具有唯一的XYUV坐标 - 位置会发生变化,因为不同的零件尺寸不同)
现在我将尝试为每个字符设置一个顶点数组,其中包含所有部分的xyuv,并计算每个部分的矩阵,并在着色器中重新定位它们.我知道这会有效,但是我担心性能不会比仅仅为我在开始时做的每一帧上传XYUV更好.
有没有更好的方法来做到这一点而不会失去我获得的表现?
我可以尝试一些疯狂的想法吗?
我正在为自己构建一个API来进行2D骨架动画.
我有一个Bone类和一个Skeleton类.
Skeleton创建一个根骨,然后通过提供父骨骼,通过Skeleton的add方法添加后续骨骼.
我现在想要做的是添加动画和帧.
我在想的是一个可以加载和插入动画的类.所以这将是一个加载动画的对象.然后,在每个帧处,接收一个Skeleton并相应地修改Skeleton.
这是一个很好的设计吗?动画是否应该采用Skeleton,或者Skeleton是否应该采用动画并将其应用到自身?
我迷失了骨骼动画.我已经读过一些有关这方面的事情,但他们仍然是我不明白的一件事.这是我的结论.我看到了3种使用骨骼为网格设置动画的方法:
我有一个Mesh类,它包含顶点,顶点缓冲区,索引缓冲区和纹理着色器,以及变换矩阵.我可以为每个骨骼使用类,增加重量,我可以轻松地为模型设置动画.但这意味着使用太多的内存,因为存储的某些内容在必须只使用一次时会被使用.
使用顶点着色器.在输入顶点参数中添加权重和骨骼索引,并使用矩阵数组作为全局变量,因此在着色器中我只需要使用骨骼矩阵.这个解决方案似乎对我来说效率更高,但我记得在directx 11教程(来自Rastertek)中他说HLSL应该很快,因为它使用了很多时间,而且我认为这太重了.无论如何这是我会尝试的解决方案,至少知道它是否有效.
为每个骨骼使用矩阵和逆矩阵.至于阅读,这是采取的方式.但这是我不理解的方式.为什么这里使用矩阵求逆,以及矩阵如何"链接"到顶点.我的意思是如果我移动右手骨骼的矩阵,代码中说什么只会使用右手顶点?
所以我的问题是:
我希望你能理解我,因为我不确定我解释得好.请原谅我的英语,我尽我所能.提前致谢.
为我的游戏编写硬件皮肤,并且还需要为法线制作动画.从这篇文章中我了解到,通常要改变法线,你需要这样的东西:
transformed_normal = transpose(inverse(bone[i])) * normal;
Run Code Online (Sandbox Code Playgroud)
我不能通过制服将第二组预先计算的转置(反向(骨骼))传递给着色器,因为我没有足够的制服.所以我必须在顶点着色器中计算这个转置(inverse(bone [i]))(对于数千个顶点中的每一个都是一次又一次),不是吗?有没有更快的方法来做到这一点?这个操作的一些便宜和肮脏的近似?
编辑:找到这个很酷的解决方案/sf/answers/3256260731/
我正在使用 ColladaLoader 将模型和骨骼动画加载到 Three.js 中,据我所知,它似乎正在执行正确的动作,但由于某种原因,动画速度快得离谱。你如何控制动画的速度?
所以Unity中有一个功能支持将PSB文件导入为2d字符:
https://docs.unity3d.com/Packages/com.unity.2d.psdimporter@1.2/manual/index.html
(尽管它只适用于 PSB,但出于某种原因,它被称为 PSD 导入器)
所以我在 Krita 中制作了一个简单的火柴人来用于我的新游戏,然后我注意到 Krita 不允许我导出为 PSB!不仅如此,连GIMP都不支持PSB!
我没有 Photoshop,所以有没有办法在没有 Photoshop 的情况下将我必须的 PSD 转换为 PSB?