﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ABrecht%2FSummerOfCode2005%2FInverse_Kinematics</id>
	<title>利用者:Brecht/SummerOfCode2005/Inverse Kinematics - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ABrecht%2FSummerOfCode2005%2FInverse_Kinematics"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Brecht/SummerOfCode2005/Inverse_Kinematics&amp;action=history"/>
	<updated>2026-06-11T03:49:15Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Brecht/SummerOfCode2005/Inverse_Kinematics&amp;diff=41964&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Brecht/SummerOfCode2005/Inverse_Kinematics&amp;diff=41964&amp;oldid=prev"/>
		<updated>2018-06-28T17:45:17Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 17:45時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Brecht/SummerOfCode2005/Inverse_Kinematics&amp;diff=41963&amp;oldid=prev</id>
		<title>wiki&gt;Brita: /*  fixing dead link*/</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Brecht/SummerOfCode2005/Inverse_Kinematics&amp;diff=41963&amp;oldid=prev"/>
		<updated>2014-09-16T10:09:36Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;fixing dead link&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Summer of Code : Inverse Kinematics=&lt;br /&gt;
&lt;br /&gt;
== Goals==&lt;br /&gt;
The goals of this project are (as in the [[BlenderDev/SoCIKProposal|proposal]]):&lt;br /&gt;
*Translational joints&lt;br /&gt;
*Rotational limits for joint&lt;br /&gt;
*Parameters like joint stiffness and end effector influence&lt;br /&gt;
*Tree structured IK chains, with multiple end effectors (joint pinning)&lt;br /&gt;
&lt;br /&gt;
The emphasis of this project will be not so much on the user interface, but more on the IK engine itself.&lt;br /&gt;
&lt;br /&gt;
== Progress==&lt;br /&gt;
At this point the code in the soc-blender tree has the following new features compared to bf-blender:&lt;br /&gt;
*0,1,2,3 DOF joints&lt;br /&gt;
*tree structure IK&lt;br /&gt;
*orientation control&lt;br /&gt;
*overall speed up (roughly 7x)&lt;br /&gt;
*rotation limits&lt;br /&gt;
*translational joints (only in the ui)&lt;br /&gt;
&lt;br /&gt;
== Implementation==&lt;br /&gt;
Most of the work will be done in the iksolver/ module with integration of the functionality in blenderkernel/, src/. The iksolver/ module integration in blender is simple: everytime the depgraph (in blenkernel/) decides to run the solver, a tree of IK segments is constructed, the system is solved, and the rotation updates are retrieved.&lt;br /&gt;
&lt;br /&gt;
There is already a user interface for Inverse Kinematics, but it will be changed. IK will no longer be a constraint, but becomes a 'built-in' posing feature, with it's own panel. Internally it is already executed separate now, after all constraints are evaluated. A different user interface is needed especially to deal with tree structures transparently. Joint limits, choice of joint degrees of freedom's, ..., will be integrated/stored on pose mode level. Ton will work on the IK user interface changes, as part of the animation recode project.&lt;br /&gt;
&lt;br /&gt;
More info on the animation system: [http://www.blender.org/cms/How_Armatures_work.634.0.html How Armatures Work], [http://www.blender.org/cms/Dependency_Graph.633.0.html|Dependency Graph].&lt;br /&gt;
&lt;br /&gt;
== IK Solver Internals==&lt;br /&gt;
The goal of the IK solver is as follows: given a set of tasks, and a set of segments, find the angles of the segments satisfying the tasks as close as possible.&lt;br /&gt;
&lt;br /&gt;
Here is a quick (probably confusing) intro in how the IK solver works. For a more detailed overview, see:&lt;br /&gt;
*[http://www.math.ucsd.edu/~sbuss/ResearchWeb/ikmethods/iksurvey.pdf Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares methods]&lt;br /&gt;
*[http://infoscience.epfl.ch/record/102000/files/Boulic_Mas_ICA_97.pdf Hierarchical Kinematic Behaviors for Complex Articulated Figures]&lt;br /&gt;
*[http://ligwww.epfl.ch/~baerloch/papers/thesis.pdf Inverse Kinematics Techniques for the Interactive Posture Control of Articulated Figures]&lt;br /&gt;
&lt;br /&gt;
For a single chain, the forward kinematics problem can be mathematically represented as follows (the extension to trees and other tasks is straightforward):&lt;br /&gt;
&lt;br /&gt;
 x = f(q)&lt;br /&gt;
&lt;br /&gt;
Where {{literal|x}} is a vector with the coordinates of an end effector, and {{literal|q}} is a vector of joint angles. So an end effector position {{literal|x}} is computed from joint angles {{literal|q}}. The inverse kinematics problem is thus:&lt;br /&gt;
&lt;br /&gt;
 q = f&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;(x)&lt;br /&gt;
&lt;br /&gt;
The function {{literal|f}} is non-linear, and for general chains too complex to solve/invert directly. So a solution is found using an iterative numerical method, looking for a local minimum. {{literal|f}} is linearized in the form of a [http://mathworld.wolfram.com/Jacobian.html Jacobian matrix], relating the derivatives of {{literal|x}} and {{literal|q}}:&lt;br /&gt;
&lt;br /&gt;
 x' = Jq'&lt;br /&gt;
&lt;br /&gt;
The initial angles {{literal|q}} can then be iteratively updated by computing:&lt;br /&gt;
&lt;br /&gt;
 q' = J&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;x', q += q'&lt;br /&gt;
&lt;br /&gt;
There is, however, a remaining problem. {{literal|J}} is in general not invertible (in most cases it's not even square). This makes sense, since there might be infinitely many solutions, or none at all. Instead of the inverse, a [http://mathworld.wolfram.com/Moore-PenroseMatrixInverse.html pseudo-inverse] of {{literal|J}} is used, which is defined for all matrices.&lt;br /&gt;
&lt;br /&gt;
But, {{literal|J}} can get ill conditioned near singularities, resulting in large oscillations. To deal with singularities, a damped pseudo-inverse is used. Computing an appropriate damping factor is essential to ensure stability, without sacrificing performance.&lt;br /&gt;
&lt;br /&gt;
The internal structure of the IK solver follows directly from the above explanation. There is a tree structure of segments, a list of tasks, and a Jacobian matrix with associated vectors/matrices. The IK solver then runs the following loop:&lt;br /&gt;
&lt;br /&gt;
[[Image:Dev-diagram.png]]&lt;br /&gt;
&lt;br /&gt;
-- [[BlenderDev/BrechtVanLommel|BrechtVanLommel]] - 21 Jul 2005&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Inverse kinematics]]&lt;/div&gt;</summary>
		<author><name>wiki&gt;Brita</name></author>
		
	</entry>
</feed>