Гузариш ба мундариҷа
Мавзӯи 2 аз 6

Саҳна ва Entity

Саҳна барои чӣ лозим аст

Дар бозии 3D танҳо тасвир кофӣ нест: барнома бояд донад, ки фарш дар куҷост, баландии миз чанд аст ва кадом ашё ҳамроҳи он ҳаракат мекунад. Саҳна фазои объектҳо ва робитаҳои байни онҳост. Ursina дар асоси Panda3D сохта шудааст ва ин фазоро бо объектҳои одии Python тасвир мекунад.

Унсури асосӣ Entity аст: объекте бо мавқеъ, андоза ва гардиш. Модел шакли намоёни онро муайян мекунад. Entity-и бе модел низ ҳамчун такягоҳи ноаёни гурӯҳи ашё муфид аст. Аввал хосиятҳоро бе равзана меомӯзем: ҳар мисоли поён алоҳида иҷро шуда, натиҷаро чоп мекунад.

Мавқеъ ва меҳварҳо

Дар Ursina меҳвари x ба рост, y ба боло ва z ҳангоми гардиши сифрӣ ба пеш равона аст. Фарш дар ҳамвории x–z ҷойгир мешавад. Сегонаи position координатаҳоро нисбат ба волидайн нигоҳ медорад; x, y ва z барои иваз кардани як ҷузъ хизмат мекунанд.

from ursina import Entity
marker = Entity(position=(1, 2, 3))
marker.x += 2
print(marker.position)
print(marker.y)

Натиҷа:

Vec3(3, 2, 3)
2.0

Иваз кардани x баландиро тағйир намедиҳад. Ин ададҳо воҳидҳои шартии ҷаҳонанд: масалан, як воҳидро як метр ҳисобидан мумкин аст. Худи муҳаррик ба онҳо маънои физикӣ намедиҳад.

Шакл, андоза ва марказ

model геометрияро интихоб мекунад: "cube", "sphere", "plane" ё "quad". color ранг ва texture тасвири рӯйи сатҳро, масалан "white_cube" ё "brick", муайян мекунад. scale модели аслиро мекашад: як адад ҳар се меҳварро яксон ва сегона ҳар меҳварро алоҳида тағйир медиҳад. Дар куби стандартӣ бо origin-и пешфарз position марказ аст ва рӯяҳои модели аслӣ дар −0.5 ва 0.5 ҷойгиранд.

from ursina import Entity
block = Entity(scale=(2, 4, 3), y=3)
print(block.scale)
print(block.y - block.scale_y / 2)
print(block.y + block.scale_y / 2)

Натиҷа:

Vec3(2, 4, 3)
1.0
5.0

Инҳо баландии поён ва болои як блоки ногардидаанд. Пас ҳангоми ҷойгиркунӣ марказро аз сатҳ фарқ кардан лозим аст. Барои модели гардида ҳисоби одӣ бо scale_y дигар рӯяи поёнии онро дар ҷаҳон муайян намекунад.

Волидайн ва координатаҳои маҳаллӣ

Волидайн (parent) объектест, ки мавқеи Entity нисбат ба он дода мешавад. Фарзанд ҳаракат, гардиш ва миқёси онро мерос мегирад. Ҳайкалчаи ба лаълӣ часпондашударо тасаввур кунед: ҳангоми бурдани лаълӣ ҷои он дар лаълӣ тағйир намеёбад. position ҷой дар лаълӣ ва world_position ҷой дар ҳуҷра аст.

from ursina import Entity
platform = Entity(position=(5, 1, -2), scale=(2, 3, 2))
lamp = Entity(parent=platform, position=(0.25, 1, 0))
print(lamp.position)
print(lamp.world_position)
platform.x += 1
print(lamp.world_position)

Натиҷа:

Vec3(0.25, 1, 0)
Vec3(5.5, 4, -2)
Vec3(6.5, 4, -2)

Дар ин ҷо волидайн нагардидааст: координатаҳои маҳаллӣ ба миқёси он зарб шуда, баъд мавқеи он ҷамъ мешавад. Дар ҳолати умумӣ гардишҳои тамоми занҷири волидайн низ ба ҳисоб гирифта мешаванд. Муҳаррик ин табдилҳоро худаш мекунад; мавқеи волидайнро бори дуюм ҷамъ накунед.

Андозаи маҳаллӣ ва ҷаҳонӣ

scale-и фарзанд низ маҳаллӣ аст. Агар такягоҳ ду баробар калон шавад, фарзанди дорои scale=1 ҳам дар ҷаҳон ду баробар калон мешавад. Барои андозаи мустақили ҷаҳонӣ world_scale-ро баъди сохтани волидайн ва фарзанд таъин кунед.

from ursina import Entity
anchor = Entity(scale=2)
icon = Entity(parent=anchor, scale=0.5)
print(icon.world_scale)
icon.world_scale = (1, 2, 1)
print(icon.scale)

Натиҷа:

Vec3(1, 1, 1)
Vec3(0.5, 1, 0.5)

Равзана чӣ тавр оғоз мешавад

Дар барномаи равзанадор аввал Ursina, Entity, color ва EditorCamera-ро ворид карда, баъд app = Ursina() месозанд. Сипас Entity-ҳои намоён, масалан Entity(model="cube", color=color.orange), сохта мешаванд. EditorCamera() имкон медиҳад саҳнаро бо муш бинед ва app.run() даври барномаро оғоз мекунад. EditorCamera барои омӯзиши саҳна аст; баъдтар онро камераи бозӣ иваз мекунад.

Дар масъалаҳо оғози равзана зери if name == "main": ҷойгир аст. Ҳангоми санҷиш функсияҳо бе оғози даври бозӣ бор мешаванд. Дар дохил муҳаррик дарахти саҳнаро нигоҳ медорад: табдилҳоро аз волидайн ба фарзандон нав карда, баъд камера объектҳоро ба экран мебарорад. Entity-и бе модел ҳам узви дарахт аст, ҳарчанд чизе барои кашидан надорад.

Хатоҳои маъмул ва ислоҳи онҳо

  1. Entity(model="cube", scale_y=4, y=0) нисфи кубро зери фарш мегузорад. Барои куби алоҳида рӯйи фарши y=0 марказ бояд дар баландии 2 бошад.
  2. child.position = parent.position координатаҳои ҷаҳониро ҳамчун маҳаллӣ менависад ва ҷойивазкуниро ду бор ҳисоб мекунад. Фосилаи маҳаллиро диҳед ё child.world_position-ро истифода баред.
  3. child.scale = 1 бо волидайни калоншуда фарзандро ҳам калон мекунад. Барои андозаи ҷаҳонӣ world_scale-ро истифода баред.
  4. from ursina import * метавонад номҳои шинос, масалан sum-ро иваз кунад. Номҳои лозимиро ошкоро ворид кунед.
  5. app.run() дар сатҳи асосӣ ҳангоми бор кардани файл аз тарафи санҷиш равзанаро мекушояд. Оғозро зери шарти main нигоҳ доред.

Ёддошт

  • Entity объект аст; model шакл, color ранг ва texture тасвири сатҳ аст.
  • x/z фарш ва y баландиро нишон медиҳанд; бо origin-и пешфарз position мавқеи маҳаллии марказ аст.
  • scale андозаҳоро зарб мекунад; rotation бо дараҷаҳо дода мешавад.
  • parent ашёро мепайвандад; position ва scale-и фарзанд бо воҳидҳои волидайнанд.
  • world_position ва world_scale натиҷаро дар ҷаҳон нишон медиҳанд.
  • Ursina() барнома месозад, EditorCamera() ба дидани саҳна ёрӣ медиҳад ва app.run() даврро оғоз мекунад.