Witaj na Forum! Zapraszamy do rejestracji lub zalogowania. Stwórz konto  


How to convert 3D model to OMSI? Big tutorial

#1
(Ten post był ostatnio modyfikowany: 18.05.2013, 17:17 przez Nick™.)

You have to download and install these programs:

- Blender ( version 2.49a )
- OmsiXConv
- MS Notepad
- OMSI Der Omnibussimulator

So, let's start

1) Download any 3D model from different game or create a model of a bus using any 3D software

2) Open Blender software

3) Import .3ds file as shown below:

[Obrazek: import.png]

4) Sometimes model can be too small or too large, so you will have to scale it

[Obrazek: 79972287.png]



5) Press the "S" button and move mouse cursor to the left or right slowly to fit the size directly

6) Scale model to the appropriate size:

[Obrazek: 26218653.png]

7) Select any object (selecting objects will result in pink edges)

Hold CTRL on keyboard and select single objects to select multiple objects.

[Obrazek: zaznaczyc.png]

8) Just in case, check that model is textured correctly by clicking "Textured" option:

[Obrazek: texturedl.png]

After selecting "Textured" option it is possible that Blender can hang for a while, just wait for a moment.

A. If the model is textured correctly, skip point B

B. If it's not - look below:

[Obrazek: imageeditor.png]

Open "UV/Image Editor"

After that you will see the image grid:

[Obrazek: beztekstury.png]

Click "ALT+N", then "ALT+O" on keyboard and search for the texture file of an object. After that texture should replace empty field:

[Obrazek: otex.png]

Next select 3D View

[Obrazek: 3dviewd.png]

Change "Textured" to "Solid" option:

[Obrazek: solidhw.png]

Go back to the starting point "A":

9) Save object:

[Obrazek: exportm.png]

Then you will see save options

[Obrazek: 93960404.png]

Change default save options to:

Click "Export Sel"

[Obrazek: 38682141.png]

Choose the destination folder

10) Repeat all the above mentioned points to all objects in a 3D model


You've done the first part of converting the 3D model to OMSI ...

... now let's see how to use OmsiXConv converting software.


So, let's do it!


11) Open OmsiXConv software

12) Check if you have selected options under pnt 13)

13) Press "Convert"

[Obrazek: convt.png]

14) Browse for exported from Blender .x file and pick it up

15) Now you can notice red icon in right down corner

[Obrazek: czerwonaf.png]

Wait till this icon dissapears ( it means that the .x file is ready after conversion to .o3d file )

16) Repeat all above mentioned points to all objects in a 3D model


Now your objects are ready to put them into OMSI




17) Enter folder

Cytat:( .../m-r software/Omsi/Vehicles )


18) Make a copy of any model

19) Enter

Cytat:(.../m-r software/Omsi/Vehicles/<Copy_name>/Model


20) Open <name>.cfg file

21) Select all by CTRL+A and DELETE. Start adding objects exported from blender and converted by OmsiXConv like that:

Cytat:[mesh]
<object_name>.o3d

[matl]
<object_texture_name>.bmp
0

[matl_envmap]
envmap.bmp
0.1

22) Now paste .o3d files to the folder below:

Cytat:(.../m-r software/Omsi/Vehicles/<Copy_name>/Model


23) And textures to:

Cytat:(.../m-r software/Omsi/Vehicles/<Copy_name>/Texture


24) Repeat all above mentioned points to all objects in a 3D model

Now let's run OMSI Der Omnibussimulator and take a look how we've done

[Obrazek: gotoweb.png]

**********************************************************************


How to make horizontal wipers? ( same like in M121MB or Solaris Urbino 12 )

25. Run Blender

26. Import whole model

27. Select wipers ( if they are connected, press TAB, then "P" and select "Separate All Loose Parts" )

İmage

28. Exportboth objects to .x format

29. Run OmsiXConv

30. Export .x files to .o3d format

31. Open your new model model.cfg file

32. Paste entry below:

Kod:
[mesh]
name_of_the_door_side_wiper.o3d

[illumination_interior]
0
1
2
3

[newanim]
origin_trans
0.000  
0.000            << replace coordinates here (pnt.13)
0.000

origin_rot_x
0
origin_rot_y
0
origin_rot_z
90

anim_rot
wiperpos
95

[mesh]
name_of_the_driver_side_wiper.o3d

[illumination_interior]
0
1
2
3

[newanim]
origin_trans
0.000
0.000              << replace coordinates here (pnt.13)
0.000

origin_rot_x
0
origin_rot_y
0
origin_rot_z
-90

anim_rot
wiperpos
95

//////////////////////////////////////

33. Go back to blender, press N and you will se frame like that:

34. Select object and press TAB

35. Frame will change to something like that

36. There is a possibility and pay attention if coordinates are set to "Local" or "Global". It has to be "Global"

37. Select rotation point on the object

38. And you get coordinates which you have to copy to model.cfg file

39. If you done everything correct, the effect should be like that:

İmage






How to make a button?

40. Run Blender

41. Import model

42. Select button you wish to use

43. Export it to .x file

44. Run OmsiXConv i expor .x file to .o3d format

45. Go back to Blender, press TAB, sellect center of the object

46. Take a look at coordinates from "Global" and remember it.

47. Open model.cfg file and paste entry below:

Kod:
[mesh]
object_name.o3d


[mouseevent]
command_name

[newanim]
origin_trans
0.000
0.000              << replace coordinates here pnt.7
0.000


origin_rot_x
0

origin_rot_y                  < enter rotation coordinates here
0

origin_rot_z
0

anim_rot
command_name
-90

* command names you can find in cockpit_varlist.osc file located in Script folder

Those changes will affect to animation after pressing button





How to make dash control light?

48. Run Blender

49. Import model

50. Select control which you want to make it light

51. Export it to .x file

52. Run OmsiXConv and export .x file to .o3d format

53. Open model.cfg file and paste entry below:

Kod:
[mesh]
control_name.o3d


[matl_change]
control_texture.bmp
0
command_name

[matl_item]

[matl_nightmap]
light_map_texture.bmp

---------------------------------------
* command names you can find in lights_varlist.osc file located in Script folder



***********************************************************

Wheels

54. Run Blender

55. Import whole bus model

56. Scale it to the appropriate size ( or load last session )

57. Import wheel file ( usually it's kp/kt.o3d )

58. Fit wheel in proper place (mudguard interior) and scale it correctly

59. After that export wheel to .x file

60. After save is done, select wheel tread

[Obrazek: 69686681.png]

61. Press "N" on the keyboard and you get something like that:

[Obrazek: 56710171.png]

62. Press TAB so the frame changes:

[Obrazek: 83381996.png]

63. Switch "Local" to "Global"

[Obrazek: 30015433.png]

64. Open model.cfg file using Notepad and add entry like that:

Kod:
**********************************************************************
                Räder
**********************************************************************

        Es folgen nun die Räder, 0=vorne, 1=hinten, bei DIESEM Bus, es richtet sich nach den Achs-Einträgen.

[mesh]
<object_name>.o3d

[illumination_interior]
-1
-1
-1
-1

[newanim]
origin_trans
1.009   <Replace rotation data from "Global" in Blender here
-2.968  <-||->
0.518   <-||->

0.532
        Drehung ist nicht notwendig, da die Räder sich ja um die X-Achse drehen.
anim_rot
Wheel_Rotation_0_R
57.295779513082320876798154814105
        Bei Achsanimationen wird die Variable in rad übergeben.

[newanim]
origin_rot_y
-90
anim_trans
Axle_Suspension_0_R
1

        Es folgt die Lenkung:
[newanim]

origin_trans
1.009   <Replace rotation data from "Global" in Blender here
-2.968  <-||->
0.518   <-||->
origin_rot_y
90
anim_rot
Axle_Steering_0_R
57.295779513082320876798154814105



[mesh]
<object_name>.o3d
[newanim]
origin_trans
1.009   <Replace rotation data from "Global" in Blender here
-2.968  <-||->
0.518   <-||->
anim_rot
Wheel_Rotation_0_L
57.295779513082320876798154814105
[newanim]
origin_rot_y
-90
anim_trans
Axle_Suspension_0_L
1
[newanim]
origin_trans
1.009   <Replace rotation data from "Global" in Blender here
-2.968  <-||->
0.518   <-||->
origin_rot_y
90
anim_rot
Axle_Steering_0_L
57.295779513082320876798154814105



[mesh]
<object_name>.o3d

[newanim]
origin_trans
1.009   <Replace rotation data from "Global" in Blender here
-2.968  <-||->
0.518   <-||->
anim_rot
Wheel_Rotation_1_R
57.295779513082320876798154814105

[newanim]
origin_rot_y
-90
anim_trans
Axle_Suspension_1_R
1



[mesh]
<object_name>.o3d

[newanim]
origin_trans
1.009   <Replace rotation data from "Global" in Blender here
-2.968  <-||->
0.518   <-||->
anim_rot
Wheel_Rotation_1_L
57.295779513082320876798154814105

[newanim]
origin_rot_y
-90
anim_trans
Axle_Suspension_1_L
1


************************************************************

Of course you have to replace data inside < > to the name of wheel file.

65. Save model.cfg file

66. Convert .x files to .o3d format

67. Copy wheel files to "Model" and textures to "Texture"

68. Run OMSI and check wheels

69. Do the same things 3 more times and you have all wheels done.

70. You have to pay attention if wheels are rotating correct. In not, you have to change numbers in x, y, z.


Doors

71. Run Blender

72. Import whole bus model

73. Scale it to the appropriate size ( or load last session )

74. Import .3ds door file

75. After correct placement export it to .x file

76. When save is done, go back to our model and select door

77. Press "N" on the keyboard and you get something like that:

78. Press TAB, frame changes, as usual:

79. Change "Local" to "Global"

80. Open model.cfg file and add:

For two-door model

Kod:
###############################################
Türen



[mesh]
<object_name>.o3d

[viewpoint]
3

[matl]
D92_03.bmp
0

[matl_lightmap]
D86_03_L1.bmp
lights_beleuchtung_unterdeck

-----------------------------

[matl]
D92_01.tga
0

[matl_envmap]
envmap_unscharf.bmp
10

[matl_bumpmap]
SD80_bump.bmp
0.05

[matl_transmap]

-----------------------------
[matl]
regen.tga
0

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]
-----------------------------

[matl]
D_dreck.tga
0

[alphascale]
Dirt_Norm

[matl_alpha]
2

[matl_noZwrite]
-----------------------------

[matl]
D92_03.bmp
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------

[matl]
Fenster_int.tga
0

[matl_noZwrite]

[matl_envmap]
envmap.bmp
0.15

[matl_alpha]
2

-----------------------------
[matl]
Fenster_int.tga
0

[matl_envmap]
envmap.bmp
1

[matl_alpha]
2

[alphascale]
Envir_Brightness

[matl_noZwrite]

-----------------------------
[matl]
D92_01.tga
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------
[matl]
regen.tga
1

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]

-----------------------------
[matl]
D_dreck.tga
1

[alphascale]
Dirt_Norm

[matl_alpha]
2

-----------------------------

[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_0
-135

[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_0
130



[mesh]
<object_name>.o3d

[viewpoint]
3

[matl]
D92_03.bmp
0

[matl_lightmap]
D86_03_L1.bmp
lights_beleuchtung_unterdeck

-----------------------------

[matl]
D92_01.tga
0

[matl_envmap]
envmap_unscharf.bmp
10

[matl_bumpmap]
SD80_bump.bmp
0.05

[matl_transmap]

-----------------------------
[matl]
regen.tga
0

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]
-----------------------------

[matl]
D_dreck.tga
0

[alphascale]
Dirt_Norm

[matl_alpha]
2

[matl_noZwrite]
-----------------------------

[matl]
D92_03.bmp
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------

[matl]
Fenster_int.tga
0

[matl_noZwrite]

[matl_envmap]
envmap.bmp
0.15

[matl_alpha]
2

-----------------------------
[matl]
Fenster_int.tga
0

[matl_envmap]
envmap.bmp
1

[matl_alpha]
2

[alphascale]
Envir_Brightness

[matl_noZwrite]

-----------------------------
[matl]
D92_01.tga
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------
[matl]
regen.tga
1

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]

-----------------------------
[matl]
D_dreck.tga
1

[alphascale]
Dirt_Norm

[matl_alpha]
2

-----------------------------

[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_0
135

[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_0
-130


+++++++++++++++++++++++++++++++++




[mesh]
<object_name>.o3d

[viewpoint]
3

[matl]
D92_03.bmp
0

[matl_lightmap]
D86_03_L1.bmp
lights_beleuchtung_unterdeck

-----------------------------

[matl]
D92_01.tga
0

[matl_envmap]
envmap_unscharf.bmp
10

[matl_bumpmap]
SD80_bump.bmp
0.05

[matl_transmap]

-----------------------------
[matl]
regen.tga
0

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]
-----------------------------

[matl]
D_dreck.tga
0

[alphascale]
Dirt_Norm

[matl_alpha]
2

[matl_noZwrite]
-----------------------------

[matl]
D92_03.bmp
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------
[matl]
D92_03.bmp
2

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]


[matl_lightmap]
D86_03_L1.bmp
lights_beleuchtung_unterdeck

-----------------------------
[matl]
Fenster_int.tga
0

[matl_noZwrite]

[matl_envmap]
envmap.bmp
0.15

[matl_alpha]
2

-----------------------------
[matl]
Fenster_int.tga
0

[matl_envmap]
envmap.bmp
1

[matl_alpha]
2

[alphascale]
Envir_Brightness

[matl_noZwrite]

-----------------------------
[matl]
D92_01.tga
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------
[matl]
regen.tga
1

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]

-----------------------------
[matl]
D_dreck.tga
1

[alphascale]
Dirt_Norm

[matl_alpha]
2

-----------------------------


[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_1
-135

[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_1
130



+++++++++++++++++++++++++++++++++



[mesh]
<object_name>.o3d

[viewpoint]
3

[matl]
D92_03.bmp
0

[matl_lightmap]
D86_03_L1.bmp
lights_beleuchtung_unterdeck

-----------------------------

[matl]
D92_01.tga
0

[matl_envmap]
envmap_unscharf.bmp
10

[matl_bumpmap]
SD80_bump.bmp
0.05

[matl_transmap]

-----------------------------
[matl]
regen.tga
0

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]
-----------------------------

[matl]
D_dreck.tga
0

[alphascale]
Dirt_Norm

[matl_alpha]
2

[matl_noZwrite]
-----------------------------

[matl]
D92_03.bmp
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------
[matl]
D92_03.bmp
2

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

[matl_lightmap]
D86_03_L1.bmp
lights_beleuchtung_unterdeck

-----------------------------
[matl]
Fenster_int.tga
0

[matl_noZwrite]

[matl_envmap]
envmap.bmp
0.15

[matl_alpha]
2

-----------------------------
[matl]
Fenster_int.tga
0

[matl_envmap]
envmap.bmp
1

[matl_alpha]
2

[alphascale]
Envir_Brightness

[matl_noZwrite]

-----------------------------
[matl]
D92_01.tga
1

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]

-----------------------------
[matl]
regen.tga
1

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]

-----------------------------
[matl]
D_dreck.tga
1

[alphascale]
Dirt_Norm

[matl_alpha]
2

-----------------------------


[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_1
135

[newanim]
origin_trans
1.009   <Replace here data from "Global" in Blender
-2.968  <-||->
0.518   <-||->
origin_rot_x
0
origin_rot_y
-90
origin_rot_z
0
anim_rot
door_1
-130

Data inside < > of course replace to door files

81. Save model.cfg file

82. Convert .x files to .o3d format

83. Copy door files to "Model" and textures to "Texture"

84. Run OMSI and check doors

85. Do the same things 3 more times and you have all wheels done.

86. You have to pay attention if wheels are rotating correct. In not, you have to change numbers in x, y, z.


*******************************************************************

Displays


87. Run Blender

88. Import model

89. Make "Plane" and fit it to size and placement of Display

90. Create texture for display object ( depends if it is line or direction display ) Matrix_Ziel_font.bmp or Matrix_Linie_S.bmp

91. Export object oraz convert it using OMSIXConv

92. In model.cfg file create entry below:

Kod:
[mesh]
direction_display.o3d

[matl]
Matrix_Ziel_font.bmp
0

[useTextTexture]
2                                                <---------- here you can select font, for me Matrix_Terminus has number 2

[matl_alpha]
2

[matl_lightmap]
Matrix_Ziel_font_LM02.bmp          <----- with this line display illumination will be turned on after turning on the power switch
elec_busbar_main

******************************************************************

Mirrors

93. Run Blender, import model

94. Find mirrors or mirrors inside the mirror cover

95. If mirrors have no separate object for reflection:*

a) Select mirror object
b) Press "P" to separate it

* - if mirrors have separated reflection object skip above section

96. Create reflection textures with reflexionX.bmp (usually x is number from 1 to 3 and means one of 3 mirrors, left, right and interior )

97. In model.cfg file create entry below:

Kod:
-------mirrors---------
[mesh]
<object_name>.o3d

[matl]
reflexion1.bmp
1

[matl_envmap]
envmap.bmp
0.1
------------------
[mesh]
<object_name>.o3d

[matl]
reflexion2.bmp
1

[matl_envmap]
envmap.bmp
0.1
------------------
[mesh]
<object_name>.o3d

[matl]
reflexion0.bmp
1

[matl_envmap]
envmap.bmp
0.1
===================

98. Next export those objects to .x and then to .o3d files

99. In .bus file you have to enter coordinates for mirrors (same as for doors or wheels) to make them show correct reflection

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



Tutorial by Nick™. Translate to english: Mattez. All right reserved.

Tutorial is WIP



Orginal tutorial in polish language here: http://strefa-omsi.pl/Watek-Wielki-porad...o-OMSI--79


Do you have questions? Write here!
[Obrazek: 71972199532229830538.png]
Odpowiedz

#2

I would really like to know how to make object as a collision mesh, since whatever i do, objects or models which i make for OMSI dont have a collision, everything can go thru them..
Odpowiedz

#3

Can you tell make glass?
Odpowiedz

#4
(Ten post był ostatnio modyfikowany: 09.10.2013, 08:29 przez mattez.)

(31.07.2013, 23:34)Dean Ericsson napisał(a): I would really like to know how to make object as a collision mesh, since whatever i do, objects or models which i make for OMSI dont have a collision, everything can go thru them..

Correct me if I'm wrong, but I think the only one thing that decides if an object is a collision mesh is a [nocollision] entry in .sco file. If it's there you can go thru an object, if you delete this entry it should work fine then.

(08.10.2013, 16:06)HaLiL21 napisał(a): Can you tell make glass?

To make glass it should work if you just make a transparent texture (of course if you have you object prepared correctly, remember we are talking about conversion here, not creation). Remember to add proper entries in .cfg file, you can analize an original entry from MAN D92 of one of randomly choosed windows:
Kod:
################################################

Fenster von innen

[mesh]
D92\D92_Fenster_int.o3d

[viewpoint]
3

-----------------------------
[matl]
D92_03.bmp
0

[matl_transmap]
D86_trans.tga

[matl_alpha]
2

[matl_noZwrite]
-----------------------------
[matl]
Fenster_braun_int.tga
0

[matl_noZwrite]
 
[matl_envmap]
envmap.bmp
0.15
 
[matl_alpha]
2

-----------------------------
[matl]
regen.tga
0

[matl_alpha]
2

[alphascale]
Rain_Window_Norm_Wetness

[matl_noZwrite]
-----------------------------
[matl]
regen.tga
1

[matl_alpha]
2

[alphascale]
Rain_Window_Front_Wetness

[matl_noZwrite]
-----------------------------
[matl]
regen.tga
2

[matl_alpha]
2

[alphascale]
Rain_Window_Wiped_Wetness

[matl_noZwrite]
-----------------------------
[matl]
D_dreck.tga
0

[alphascale]
Dirt_Norm

[matl_alpha]
2

[matl_noZwrite]
-----------------------------
[matl]
D_dreck.tga
1

[alphascale]
Dirt_Wiped

[matl_alpha]
2

[matl_noZwrite]
-----------------------------

!NIE POMAGAM NA PW - OD POMOCY JEST FORUM!

PCB: Gigabyte GA-970A-DS3
CPU: AMD FX-8350 @ 8x4.4GHz + Raijintek EreBoss
RAM: 8GB RAM DDR3
GPU: Sapphire Radeon RX480 Nitro+ 8GB
PSU: Corsair TX850M
OS: Windows 10 Pro x64

Zanim cokolwiek napiszesz, przeczytaj koniecznie REGULAMIN
Jeśli masz problem techniczny, zapoznaj się z ZASADAMI DZIAŁÓW TECHNICZNYCH
Jeśli chcesz podzielić się dodatkiem, zapoznaj się z REGULAMINEM DZIAŁU POBIERALNIA



Find me on: fb.me/mattezpl
Odpowiedz

#5
(Ten post był ostatnio modyfikowany: 06.03.2016, 18:39 przez AlleE652Brennero.)

Interesting tutorial, but i can't see pics in this tutorial. :S
Odpowiedz

#6

I and my friend building local city bus

our project based MAN NL 202 frenzymax

I very beginner level in modelling software but I solved "origin from mesh and anim rot " animation .

But gearbox contoller animation

Kod:
[newanim]
origin_from_mesh
anim_trans
cockpit_gang3
-0.021


I selected down corner of button model in blender and pivot point progres( cursor selection > object mode > center > cursor )

my button moving left direction not pressing button animaton

please help me
Odpowiedz




Użytkownicy przeglądający ten wątek: