9.2. Figury 2D i 3D

Możliwość programowego umieszczania różnych bloków w Minecraft Pi Edition można wykorzystać jako atrakcyjny sposób wizualizacji różnych figur. Jednak o ile budowanie prostych kształtów, jak np. kwadrat czy sześcian, nie stanowi raczej problemu, o tyle trójkąty, koła i bardziej skomplikowane budowle nie są trywialnym zadaniem. Tworzenie 2- i 3-wymiarowych konstrukcji ułatwi nam biblioteka minecraftstuff.

Instalacja

Symulator mcpi-sim domyślnie nie działa z omawianą biblioteką i wymaga modyfikacji. Zmienione pliki oraz omawianą bibliotekę umieściliśmy w archiwum mcpi-sim-fix.zip, które po ściągnięciu należy rozpakować do katalogu ~/mcpi-sim/local nadpisując oryginalne pliki.

9.2.1. Linia

W pustym pliku mcsim-fig.py umieszczamy kod:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import local.minecraft as minecraft  # import modułu minecraft
import local.block as block  # import modułu block
import local.minecraftstuff as mcstuff  # import biblioteki do rysowania figur
from local.vec3 import Vec3  # klasa reprezentująca punkt w MC

os.environ["USERNAME"] = "Steve"  # nazwa użytkownika
os.environ["COMPUTERNAME"] = "mykomp"  # nazwa komputera

mc = minecraft.Minecraft.create("")  # połaczenie z symulatorem
figura = mcstuff.MinecraftDrawing(mc)  # obiekt do rysowania kształtów


def plac(x, y, z, roz=10, gracz=False):
    """
    Funkcja tworzy podłoże i wypełnia sześcienny obszar od podanej pozycji,
    opcjonalnie umieszcza gracza w środku.
    Parametry: x, y, z - współrzędne pozycji początkowej,
    roz - rozmiar wypełnianej przestrzeni,
    gracz - czy umieścić gracza w środku
    Wymaga: globalnych obiektów mc i block.
    """

    podloga = block.STONE
    wypelniacz = block.AIR

    # podloga i czyszczenie
    mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, podloga)
    mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, wypelniacz)
    # umieść gracza w środku
    if gracz:
        mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)


def linie():
    # Funkcja rysuje linie
    # tuple z współrzędnymi punktów
    punkty1 = ((-10, 0, -10), (10, 0, -10), (10, 0, 10), (-10, 0, 10))
    punkty2 = ((-15, 5, 0), (15, 5, 0), (0, 5, 15), (0, 5, -15))
    p1 = Vec3(0, 0, 0)  # punkt początkowy
    for punkt in punkty1:
        x, y, z = punkt
        p2 = Vec3(x, y, z)  # punkt końcowy
        figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.WOOL, 14)
    for punkt in punkty2:
        x, y, z = punkt
        p2 = Vec3(x, y, z)  # punkt końcowy
        figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.OBSIDIAN)


def main():
    mc.postToChat("Biblioteka minecraftstuff")  # wysłanie komunikatu do mc
    plac(-15, 0, -15, 30)
    linie()  # wywołanie funkcji

    return 0


if __name__ == '__main__':
    main()

Większość kodu omówiona została w Podstawach. W nowym kodzie, który został podświetlony, importujemy bibliotekę minecraftstuff oraz klasę Vec3. Reprezentuje ona punkty o podanych współrzędnych w trójwymiarowym świecie MC. Polecenie figura = mcstuff.MinecraftDrawing(mc) tworzy instancję głównej klasy biblioteki, która udostępni jej metody.

Do rysowania linii wykorzystujemy metodę drawLine(), której przekazujemy jako argumenty współrzędne punktu początkowego i końcowego, a także typ bloku i ewentualnie podtyp. Ponieważ chcemy narysować kilka linii wychodzących z tego samego punktu, współrzędne punktów końcowych umieszczamy w dwóch tuplach (niemodyfikowalnych listach) jako... tuple. W pętlach odczytujemy je (for punkt in punkty1:), rozpakowujemy (x, y, z = punkt) i przekazujemy do konstruktora omówionej wyżej klasy Vec3 (p2 = Vec3(x, y, z)).

Całość omówionego kodu dla przejrzystości umieszczamy w funkcji linie(), którą wywołujemy w funkcji głównej i testujemy.

9.2.2. Koło

Przed funkcją główną main() wstawiamy kod:

Kod nr
54
55
56
57
def kolo(x, y, z, r):
    # Funkcja rysuje koło pionowe i poziome o środku x, y, z i promieniu r
    figura.drawCircle(x, y, z, r, block.LEAVES, 2)
    figura.drawHorizontalCircle(x, y, z, r, block.LEAVES, 2)

Funkcja kolo(x, y, z, r) wykorzystuje metodę drawCircle() do rysowania koła w pionie oraz drawHorizontalCircle() do rysowania koła w poziomie. Obydwie metody pobierają współrzędne środka koła, jego promień oraz typ i podtyp bloku, służącego do rysowania.

Umieść wywołanie funkcji, np. kolo(0, 10, 0, 10), w funkcji głównej i przetestuj.

9.2.3. Kula

Do skryptu wstawiamy kolejną funkcję przed funkcją main():

Kod nr
60
61
62
def kula(x, y, z, r):
    # Funkcja rysuje kulę o środku x, y, z i promieniu r
    figura.drawSphere(x, y, z, r, block.WOOD, 2)

Metoda drawSphere() buduje kulę. Pierwsze trzy argumenty to współrzędne środka, kolejne to: promień, typ i ewentualny podtyp bloku. Umieść wywołanie funkcji, np. kula(0, 10, 0, 9), w funkcji głównej i przetestuj.

9.2.4. Kształt

Przed funkcją main() wstawiamy:

Kod nr
65
66
67
68
69
70
71
def ksztalt():
    # Funkcja łączy podane w liście wierzchołki i opcjonalnie wypełnia figurę
    ksztalt = []  # lista punktów
    ksztalt.append(Vec3(-11, 0, 11))  # współrzędne 1 wierzchołka
    ksztalt.append(Vec3(11, 0, 11))  # współrzędne 2 wierzchołka
    ksztalt.append(Vec3(0, 0, -11))  # współrzędne 3 wierzchołka
    figura.drawFace(ksztalt, True, block.SANDSTONE, 2)

Chcąc narysować trójkąt do listy do listy ksztalt dodajemy trzy instancje klasy Vec3 definiujące kolejne wierzchołki: ksztalt.append(Vec3(-11, 0, 11)). Do rysowania dowolnych kształtów służy metoda drawFace(), która punkty przekazane w liście łączy liniami budowanymi z podanego bloku. Drugi argument, logiczny, decyduje o tym, czy figura ma zostać wypełniona (True), czy nie (False).

Po wywołaniu wszystkich omówionych funkcji możemy zobaczyć w symulatorze poniższą budowlę:

../../_images/mcsim-fig.png

Ćwiczenie 1

Wykorzystując odpowiednią metodę biblioteki minecraftstuff, spróbuj zbudować napis “KzK” podobny do pokazanego poniżej. Przetestuj swój kod w symulatorze i w Minecrafcie Pi.

../../_images/mcsim-KzK.png

Licencja Creative Commons Materiały Python 101 udostępniane przez Centrum Edukacji Obywatelskiej na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.

Utworzony:2022-05-22 o 19:52 w Sphinx 1.5.3
Autorzy:Patrz plik “Autorzy”