Όλοι οι χρόνοι είναι UTC + 2 ώρες




Δημιουργία νέου θέματος Απαντήστε στο θέμα  [ 3 Δημοσιεύσεις ] 
Συγγραφέας Μήνυμα
ΔημοσίευσηΔημοσιεύτηκε: Παρ Μαρ 13, 2015 11:29 pm 
Χωρίς σύνδεση
Regular Member
Άβαταρ μέλους

Εγγραφή: Τετ Οκτ 31, 2012 10:58 pm
Δημοσιεύσεις: 304
Images: 30
Has thanked: 1 time
Been thanked: 34 times
Έπειτα από πάρα πολύ καιρό, αποφάσισα να γράψω λίγα πράγματα σχετικά με το scripting στο Blender. Αυτό είναι το δέυτερο κομμάτι του οδηγού, και είναι μια εισαγωγή στον καθαρό κώδικα, με πιο πρακτικό χαρακτήρα.

Για το πρώτο στάδιο "Turbo Εισαγωγή Στο Blender Scripting" πατήστε εδώ:
viewtopic.php?f=33&t=106

Κώδικας:
# Κάνουμε επικόλληση το τρέχον σκριπ στο Text Editor
# του Blender και έπειτα στο τέλος τέρμα κάτω
# κάνουμε comment ή uncomment την κάθε συναρτηση
# ώστε να εκτελεστεί το κατάλληλο τμήμα του μαθήματος.

import bpy

# Έτσι για ζέσταμα...
# 0. Αυτό το μάθημα δεν έχει καμία σχέση με το Blender,
# αλλά με την Python, ο σκοπός μου είναι να δείξω πως
# η Python είναι κανονική γλώσσα προγραμματισμού.
def tutorial0():
   # Σημείωση: Επειδή η Python υποστηρίζει Unicode χαρακτήρες
   # μπορώ να δηλώσω τις μεταβλητές με Ελληνικά γράμματα
   # (κατά προσωπική προτίμηση δίχως τόνους για ευκολία γραφής)
   # ώστε να είναι περισσότερο κατανοητό το πρόγραμμα.
   τιμη = 100
   φπα = 24
   φπα_στην_τιμη = τιμη * (φπα / 100)
   τιμη_συν_φπα = τιμη + φπα_στην_τιμη
   # Δυστυχώς η κονσόλα του Blender δεν υποστηρίζει ακόμα
   # χαρακτήρες Unicode (πιθανώς στο μέλλον να αλλάξει)
   # αλλά για χάρη του παραδείγματος βάζω Greeklish.
   print("Timi me FPA:", τιμη_συν_φπα)
   print("FPA", φπα_στην_τιμη)

# 1. Εμφάνιση των ονομάτων από τα αντικείμενα της σκηνής.
# Ερώτηση: Πως γίνεται το λουπάρισμα σε μια λίστα;
def tutorial1():

   # Επειδή από εδώ και στο εξής θα εμφανίζονται συνεχώς κάποια
   # συγκεκριμένα πράγματα (π.χ. context, scene, object) θα είναι
   # καλή ιδέα να γίνει κάποια αναφορά σε αυτά ώστε να γίνει
   # καλύτερα κατανοητός ο σκοπός τους.

   # Περισσότερες πληροφορίες για το context
   # http://www.blender.org/api/blender_python_api_2_73_release/bpy.context.html?highlight=context#module-bpy.context

   # Περισσότερες πληροφορίες για την σκηνή
   # http://www.blender.org/api/blender_python_api_2_73_release/bpy.types.Scene.html#bpy.types.Scene

   # Περισσότερες πληροφορίες για τα αντικείμενα της σκηνής
   # http://www.blender.org/api/blender_python_api_2_73_release/bpy.types.Object.html#bpy.types.Object

   # Απάντηση: Όλα τα αντικείμενα βρίσκονται σε μια λίστα που
   # λέγεται "objects", με την χρήση της εντολής επανάληψης for
   # γίνεται το λουπάρισμα στην λίστα. Η μεταβλητή i εν προκειμένη
   # περίπτωση αντιστοιχεί στο κάθε ένα αντικείμενο της λίστας.
   for i in bpy.context.scene.objects:
      print(i.name)

# 2. Εμφάνιση των ονομάτων από τα αντικείμενα τύπου mesh.
# Ερώτηση: Πως μπορώ να γνωρίζω εάν το αντικειμένο της σκηνής
# είναι τύπου mesh;
def tutorial2():
   for i in bpy.context.scene.objects:
      # Απάντηση: Γίνεται σύγκριση δύο strings ένα στα αριστερά
      # είναι αυτό που έχει το αντικείμενο και άλλο στα δεξιά
      # αυτό που με ενδιαφέρει.
      # Περισσότερες πληροφορίες για τους τύπους αντικειμένων.
      # http://www.blender.org/api/blender_python_api_2_73_release/bpy.types.Object.html#bpy.types.Object.type
      if i.type == "MESH":
         print(i.name)

# 3. Τοποθέτηση των αντικειμένων τύπου mesh σε τυχαία θέση
def tutorial3():
   # Αυτό το module περιέχει την εντολή που θα επιστρέφει τυχαίο αριθμό.
   import random
   # Πόση είναι η μέγιστη τιμή για την τοποθέτηση των αντικειμένων.
   # Έχω υπ' όψην δύο άξονες όπως τους X, Y (όπου είναι Πλάτος, Βάθος).
   rnd_range = 100
   # Επίσης έχω και μια μέγιστη τιμή για το ύψος. Ο λόγος που την έβαλα
   # ξεχωριστά είναι επειδή θέλω να έχω καλύτερο έλεγχο στις τυχαίες τιμές.
   rnd_height = 1
   for i in bpy.context.scene.objects:
      if i.type == "MESH":
         # Ο υπολογισμός της τυχαίας θέσης είναι λίγο περίπλοκος αλλά έχει λογική.
         # Η εντολή random() επιστρέφει μια τυχαία τιμή (με υποδιαστολή) από το 0 έως το 1.
         # Εάν πολλαπλασιάσω το random() επί έναν αριθμό θα έχω ακριβώς το μέγεθος που βολεύει.
         # Όμως το πρόβλημα είναι ότι οι τιμές θα έρχονται π.χ. από το 0 έως το 100.
         # Οπότε θα αφαιρέσω το μισό αριθμό ώστε οι τιμές να κεντραριστούν.
         # Έτσι τα αντικείμενα να τοποθετούνται από -50 έχω 50 μονάδες.
         i.location[0] = (random.random() * rnd_range) - (rnd_range * 0.5)
         i.location[1] = (random.random() * rnd_range) - (rnd_range * 0.5)
         i.location[2] = random.random() * rnd_height

# 4. Περιστροφή των αντικειμένων τύπου mesh σε τυχαία τιμή.
def tutorial4():
   import random
   # Αυτό το module έχει την μεταβλητή pi όπου επιστρέφει τον αριθμό π
   import math
   # Υπολογίζω το διπλάσιο του του αριθμού π για έναν απλό λόγο.
   # Επειδή 2*π είναι ένας πλήρης κύκλος.

   # Από εγκυκλοπαιδική άποψη, εμείς μετράμε με μοίρες ώστε να έχουμε καλύτερη
   # κατανόηση των αριθμών (π.χ. πόσο είναι 90 μοίρες). Αλλά στην γεωμετρία
   # και τώρα προγραμματισμό η περιστροφές υπολογίζονται με Radians, μόνο για
   # λόγος απόδοσης και ακρίβειας.
   # http://en.wikipedia.org/wiki/Radian
   
   two_pi = math.pi * 2
   for i in bpy.context.scene.objects:
      if i.type == "MESH":
         # Πάλι με τον γνωστό πολλαπλασιαμό θέτω την μέγιστη τιμή περιστροφής.
         i.rotation_euler[0] = random.random() * two_pi
         i.rotation_euler[1] = random.random() * two_pi
         i.rotation_euler[2] = random.random() * two_pi

# 5. Δημιουργία πολλών κύβων
def tutorial5():
   total_objects = 100
   # Εκτελείται Χ φορές η εντολή δημιουργίας κύβου.
   for i in range(total_objects):
      # H εντολή primitive_cube_add είναι αντιγραφή κατευθείαν
      # από το information window, ευτυχώς δεν χρειάζεται να την
      # μάθουμε απ' έξω αλλά εάν χρειαστεί να βρούμε περισσότερες
      # πληροφορίες για την δημιουργία αντικειμένων mesh:
      # http://www.blender.org/api/blender_python_api_2_73_release/bpy.ops.mesh.html?highlight=primitive_cube_add#bpy.ops.mesh.primitive_cube_add
      
      # Εάν χρειαστεί μπορώ να αλλάξω το location
      # κατευθείαν με τιμές που με ενδιαφέρουν
      # αλλά προς το παρόν τα αφήνω όλα στο κέντρο.

      # Η πιο κουφή παράμετρος είναι είναι αυτή
      # με τα layers, όπου θα πρέπει να στείλω ένα
      # Tuple με 16 τιμές boolean, εν αντιστοιχία των
      # layers της σκηνής.
      # To tuple () είναι ακριβώς ίδιο με το list []
      # με μόνη διαφορά ότι το tuple δεν επιτρέπει
      # μεταβολή στα περιεχόμενα του.

      bpy.ops.mesh.primitive_cube_add(
         radius=1, view_align=False,
         enter_editmode=False,
         location=(0, 0, 0),
         layers=(
         True, False, False, False, False,
         False, False, False, False, False,
         False, False, False, False, False,
         False, False, False, False, False)
      )

# 6. Διαγραφή όλων των αντικειμένων τύπου mesh
def tutorial6():
   # Η πιο εύκολη εκδοχή είναι να χρησιμοποιήσω
   # όσο το δυνατόν το API του Blender. Οι εντολές
   # είναι απευθείας αντιγραφή από το Information Window,
   # οπότε αυτό σημαίνει πως είναι καλή πρακτική όσες
   # λειτουργίες παρέχονται απευθείας να χρησιμοποιούνται.

   # Εν αντιθέσει, η μεγαλύτερη εκδοχή. Θα έκανα αναδρομή
   # σε όλα τα αντικείμενα της σκηνής, θα τσέκαρα εάν είναι
   # τύπου MESH, εάν ήταν θα το επέλεγα. Έπειτα στο τελείωμα,
   # θα εκτελούσα την εντολή διαγραφής.
   bpy.ops.object.select_by_type(type='MESH')
   bpy.ops.object.delete(use_global=False)


tutorial0()
# tutorial1()
# tutorial2()
# tutorial3()
# tutorial4()
# tutorial5()
# tutorial6()


Υ.Γ.

Σχόλια ή παρατηρήσεις δεκτά (κυρίως αρνητικά σχόλια :x ) ώστε να γνωρίζω εάν οι αναγνώστες δυσκολεύονται.

Συνιστώ να κάνετε επικόλληση το κείμενο σε ένα text editor που χρωματίζει τον κώδικα κατάλληλα, ώστε να είναι ευανάγνωστος.

_________________
Blender3D Technical Artist


Κορυφή
 Προφίλ Personal album  
 
ΔημοσίευσηΔημοσιεύτηκε: Δευτ Μαρ 16, 2015 11:02 pm 
Χωρίς σύνδεση
Novice Member
Άβαταρ μέλους

Εγγραφή: Τετ Οκτ 31, 2012 10:49 pm
Δημοσιεύσεις: 163
Images: 2
Has thanked: 10 times
Been thanked: 14 times
Μπράβο ωραία δουλεια.

Παρεμπιπτόντως, ένας εύκολος τρόπος για την συγγραφή κώδικα με ελάχιστη χρήση του blender API ειναι με την χρήση του plugin animation nodes.

https://github.com/JacquesLucke/animation-nodes
http://blenderartists.org/forum/showthr ... tion-Nodes


Video from : youtube.com


Εικόνα

Video from : youtube.com


Video from : youtube.com

blend file:
http://habanita.org/pixels1.blend

Υ.Γ.:
Έχω κάνει ένα branch https://github.com/vvFiCKvv/animation-nodes στο οποίο έχω φτιάξει Nodes για Modifiers, Shape keys, particle system και camera.
Δύστυχος, λόγο κάποιον διαφορετικών επιλογών στο style του UI και του κώδικα δεν έχει γινει merge.

Υ.Γ2: Ενα λεπτομερες αρθρο που μόλις δημοσιευτικε:
http://www.blendernation.com/2015/03/17 ... des-addon/


Κορυφή
 Προφίλ Personal album  
 
ΔημοσίευσηΔημοσιεύτηκε: Πέμ Μαρ 19, 2015 1:01 am 
Χωρίς σύνδεση
Regular Member
Άβαταρ μέλους

Εγγραφή: Τετ Οκτ 31, 2012 10:58 pm
Δημοσιεύσεις: 304
Images: 30
Has thanked: 1 time
Been thanked: 34 times
Αυτό με το Animation Nodes είναι πάρα πολύ χρήσιμο. Με λίγο πειραματισμό και παιχνίδι μπορείς να φτιάξεις τρελά πράγματα. Ίσως πρέπει να φτιάξουμε ένα ειδικό θέμα με τα Animation Nodes και να ανεβάζουμε διάφορα πράγματα.

_________________
Blender3D Technical Artist


Κορυφή
 Προφίλ Personal album  
 
Τελευταίες δημοσιεύσεις:  Ταξινόμηση ανά  
Δημιουργία νέου θέματος Απαντήστε στο θέμα  [ 3 Δημοσιεύσεις ] 

Όλοι οι χρόνοι είναι UTC + 2 ώρες


Μέλη σε σύνδεση

Μέλη σε αυτή την Δ. Συζήτηση : Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης


Δεν μπορείτε να δημοσιεύετε νέα θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να απαντάτε σε θέματα σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επεξεργάζεστε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να διαγράφετε τις δημοσιεύσεις σας σε αυτή τη Δ. Συζήτηση
Δεν μπορείτε να επισυνάπτετε αρχεία σε αυτή τη Δ. Συζήτηση

Αναζήτηση για:
Blendergr ©2011 | Developer-Founder Kornarakis Nikos | Co-founder Kampitakis Miron
Follow blendergr on Twitter