<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ode.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Simple_Bouncing_Sphere_%28rus%29</id>
	<title>Simple Bouncing Sphere (rus) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ode.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Simple_Bouncing_Sphere_%28rus%29"/>
	<link rel="alternate" type="text/html" href="https://ode.org/wiki/index.php?title=Simple_Bouncing_Sphere_(rus)&amp;action=history"/>
	<updated>2026-04-08T19:18:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://ode.org/wiki/index.php?title=Simple_Bouncing_Sphere_(rus)&amp;diff=104&amp;oldid=prev</id>
		<title>imported&gt;Richb3: /* Пример кода */</title>
		<link rel="alternate" type="text/html" href="https://ode.org/wiki/index.php?title=Simple_Bouncing_Sphere_(rus)&amp;diff=104&amp;oldid=prev"/>
		<updated>2019-03-21T19:36:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Пример кода&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:36, 21 March 2019&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l48&quot;&gt;Line 48:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 48:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  static void start()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  static void start()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;static &lt;/del&gt;float xyz[3] = {2.0f,-2.0f,1.7600f};&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     float xyz[3] = {2.0f,-2.0f,1.7600f};&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;static &lt;/del&gt;float hpr[3] = {140.000f,-17.0000f,0.0000f};&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     float hpr[3] = {140.000f,-17.0000f,0.0000f};&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     dsSetViewpoint (xyz,hpr);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     dsSetViewpoint (xyz,hpr);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Richb3</name></author>
	</entry>
	<entry>
		<id>https://ode.org/wiki/index.php?title=Simple_Bouncing_Sphere_(rus)&amp;diff=103&amp;oldid=prev</id>
		<title>imported&gt;Russ: Created page with &quot;== Введение ==  Статья описывает создание подпрыгивающей на плоскости сферы. Задание простое, но...&quot;</title>
		<link rel="alternate" type="text/html" href="https://ode.org/wiki/index.php?title=Simple_Bouncing_Sphere_(rus)&amp;diff=103&amp;oldid=prev"/>
		<updated>2019-01-07T04:38:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Введение ==  Статья описывает создание подпрыгивающей на плоскости сферы. Задание простое, но...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
Статья описывает создание подпрыгивающей на плоскости сферы. Задание простое, но оно показывает общую структуру динамического моделирования с использованием ODE.&lt;br /&gt;
&lt;br /&gt;
== Пример кода ==&lt;br /&gt;
&lt;br /&gt;
Для отображения симуляции используется drawstuff.&lt;br /&gt;
&lt;br /&gt;
Для начала объявим объекты. Вы должны объявить мир (world), пространство (space) для содержания всех объектов, тело (body) с соответствующей геометрией (geom) и массой (m), и совместную группу для хранения контактных соединений, которые создаются во время столкновения. (contactgroup)&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;ode/ode.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;drawstuff/drawstuff.h&amp;gt;&lt;br /&gt;
 // динамические объекты,  и объекты для столкновений&lt;br /&gt;
 static dWorldID world;&lt;br /&gt;
 static dSpaceID space;&lt;br /&gt;
 static dBodyID body;	&lt;br /&gt;
 static dGeomID geom;	&lt;br /&gt;
 static dMass m;&lt;br /&gt;
 static dJointGroupID contactgroup;&lt;br /&gt;
&lt;br /&gt;
Когда система обнаружит столкновение двух объектов, она вызовет код, который определит точки соприкосновения и создаст временные контакты. Параметры контактов (трение, упругость, и тд), также устанавливаются здесь.&lt;br /&gt;
&lt;br /&gt;
 // вызывается из dSpaceCollide когда два объекта в пространстве &lt;br /&gt;
 // потенциально могут столкнуться.&lt;br /&gt;
 static void nearCallback (void *data, dGeomID o1, dGeomID o2)&lt;br /&gt;
 {&lt;br /&gt;
    dBodyID b1 = dGeomGetBody(o1);&lt;br /&gt;
    dBodyID b2 = dGeomGetBody(o2);&lt;br /&gt;
    dContact contact;  &lt;br /&gt;
    contact.surface.mode = dContactBounce | dContactSoftCFM;&lt;br /&gt;
    // параметры трения&lt;br /&gt;
    contact.surface.mu = dInfinity;&lt;br /&gt;
    // параметры упругости&lt;br /&gt;
    contact.surface.bounce = 0.9;&lt;br /&gt;
    // bounce_vel - Минимальная скорость необходимая для упругости (в м/с).&lt;br /&gt;
    contact.surface.bounce_vel = 0.1;&lt;br /&gt;
    // ограничение силы &amp;quot;смешивания&amp;quot; (степень погружения одного объекта в другой при столкновении)&lt;br /&gt;
    contact.surface.soft_cfm = 0.001;  &lt;br /&gt;
    if (int numc = dCollide (o1,o2,1,&amp;amp;contact.geom,sizeof(dContact))) {&lt;br /&gt;
        dJointID c = dJointCreateContact (world,contactgroup,&amp;amp;contact);&lt;br /&gt;
        dJointAttach (c,b1,b2);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Вызывается в начале симуляции, для создания точки установки камеры в пространстве.&lt;br /&gt;
&lt;br /&gt;
 // старт симуляции - установка точки обзора (xyz) и направления камеры (hpr)&lt;br /&gt;
 static void start()&lt;br /&gt;
 {&lt;br /&gt;
    static float xyz[3] = {2.0f,-2.0f,1.7600f};&lt;br /&gt;
    static float hpr[3] = {140.000f,-17.0000f,0.0000f};&lt;br /&gt;
    dsSetViewpoint (xyz,hpr);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Основной цикл. Он вызывает функцию обнаружения столкновений, является шагом симуляции, а так-же сбрасывает временные точки контактов и перерисовывает объекты на их новой позиции.&lt;br /&gt;
&lt;br /&gt;
 // simulation loop&lt;br /&gt;
 static void simLoop (int pause)&lt;br /&gt;
 {&lt;br /&gt;
    const dReal *pos;&lt;br /&gt;
    const dReal *R;&lt;br /&gt;
    // обнаруживает столкновение и добавляет точку контакта&lt;br /&gt;
    dSpaceCollide (space,0,&amp;amp;nearCallback);&lt;br /&gt;
    // сам шаг симуляции&lt;br /&gt;
    dWorldQuickStep (world,0.01);  &lt;br /&gt;
    // удаляет все точки контакта&lt;br /&gt;
    dJointGroupEmpty (contactgroup);&lt;br /&gt;
    // перерисовывает сферу на новой позиции&lt;br /&gt;
    pos = dGeomGetPosition (geom);&lt;br /&gt;
    R = dGeomGetRotation (geom);&lt;br /&gt;
    dsDrawSphere (pos,R,dGeomSphereGetRadius (geom));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
При запуске программы вызывается инициализация, а затем начинается симуляция.&lt;br /&gt;
&lt;br /&gt;
 int main (int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
    // установка указателей на drawstuff&lt;br /&gt;
    dsFunctions fn;&lt;br /&gt;
    fn.version = DS_VERSION;&lt;br /&gt;
    fn.start = &amp;amp;start;&lt;br /&gt;
    fn.step = &amp;amp;simLoop;&lt;br /&gt;
    fn.stop = 0;&lt;br /&gt;
    fn.path_to_textures = &amp;quot;../../drawstuff/textures&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    dInitODE ();&lt;br /&gt;
    // создание мира&lt;br /&gt;
    world = dWorldCreate ();&lt;br /&gt;
    space = dHashSpaceCreate (0);&lt;br /&gt;
    dWorldSetGravity (world,0,0,-0.2);&lt;br /&gt;
    dWorldSetCFM (world,1e-5);&lt;br /&gt;
    dCreatePlane (space,0,0,1,0);&lt;br /&gt;
    contactgroup = dJointGroupCreate (0);&lt;br /&gt;
    // создание объектов&lt;br /&gt;
    body = dBodyCreate (world);&lt;br /&gt;
    geom = dCreateSphere (space,0.5);&lt;br /&gt;
    dMassSetSphere (&amp;amp;m,1,0.5);&lt;br /&gt;
    dBodySetMass (body,&amp;amp;m);&lt;br /&gt;
    dGeomSetBody (geom,body);&lt;br /&gt;
    // установка начальной позиции&lt;br /&gt;
    dBodySetPosition (body,0,0,3);&lt;br /&gt;
    // запуск симуляции&lt;br /&gt;
    dsSimulationLoop (argc,argv,352,288,&amp;amp;fn);&lt;br /&gt;
    // очистка&lt;br /&gt;
    dJointGroupDestroy (contactgroup);&lt;br /&gt;
    dSpaceDestroy (space);&lt;br /&gt;
    dWorldDestroy (world);&lt;br /&gt;
    dCloseODE();&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>imported&gt;Russ</name></author>
	</entry>
</feed>