Python
Как написать мизерный адднон для blender 3D?
Мне нужен аддон, который бы выравнивал координаты двух выбранных точек. Алгоритм для примера такой: есть две точки А (х= - 2; у= 3; z= 4) и Б (х= 1; у= 5; z= 6). Я их выделяю, жму кнопку, а алгоритм делает следующее: По Z и Y просто выравниваем значения: (Za + Zб) / 2, (Ya + Yб) / 2 потом присваиваем полученное значение координатам. А вот по Х нужно будет соблюсти знаки: если Ха была отрицательной, а Хб положительной, то и после вычисления среднего значения они должны сохранить свои знаки, т. е. складываем модули двух координат, результат делим на 2, а после присвоения подставляем к Ха знак минуса. Ни разу не писал аддоны под blender, может кто подскажет, вроде не сложное действие. Самое главное впихнуть кнопку типа "выровнять" куда-нибудь в меню
насколько знаю для блендера можно писать скрипты на питоне
Михаил Портнягин
Ок, я в курсе
Ниже привожу текст требуемого дополнения, необходимо создать в текстовом редакторе Blender связанный текстовй блок и скопировать туда этот скрипт. Запустить его ALT+P. После этого в панели инструментов Tools окна 3D View появиться секция Avarage vertex и кнопка Avarage, которая будет выравнивать вершины по описанному выше алгоритму.
import math
import bpy
import mathutils
class MakerPanel(bpy.types.Panel) :
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Tools"
bl_label = "Avarage vertex"
def draw(self, context) :
TC = self.layout.column(align = True)
TC.operator("mesh.make", text = "Avarage")
class Make(bpy.types.Operator) :
bl_idname = "mesh.make"
bl_label = "Avarage"
bl_options = {"UNDO"}
def invoke(self, context, event) :
bpy.ops.object.mode_set(mode='OBJECT')
ob = bpy.context.object
me = ob.data
verts = [v for v in ob.data.vertices if v.select]
if(len(verts)==2):
x = (math.fabs(verts[0].co[0])+math.fabs(verts[1].co[0]))/2
y = (verts[0].co[1]+verts[1].co[1])/2
z = (verts[0].co[2]+verts[1].co[2])/2
verts[0].co[1] = y
verts[1].co[1] = y
verts[0].co[2] = z
verts[1].co[2] = z
verts[0].co[0] = x if verts[0].co[0]>0 else -x
verts[1].co[0] = x if verts[1].co[0]>0 else -x
bpy.ops.object.mode_set(mode='EDIT')
return {'FINISHED'}
#end invoke
def register() :
bpy.utils.register_class(Make)
bpy.utils.register_class(MakerPanel)
def unregister() :
bpy.utils.unregister_class(Make)
bpy.utils.unregister_class(MakerPanel)
if __name__ == "__main__" :
register()
import math
import bpy
import mathutils
class MakerPanel(bpy.types.Panel) :
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Tools"
bl_label = "Avarage vertex"
def draw(self, context) :
TC = self.layout.column(align = True)
TC.operator("mesh.make", text = "Avarage")
class Make(bpy.types.Operator) :
bl_idname = "mesh.make"
bl_label = "Avarage"
bl_options = {"UNDO"}
def invoke(self, context, event) :
bpy.ops.object.mode_set(mode='OBJECT')
ob = bpy.context.object
me = ob.data
verts = [v for v in ob.data.vertices if v.select]
if(len(verts)==2):
x = (math.fabs(verts[0].co[0])+math.fabs(verts[1].co[0]))/2
y = (verts[0].co[1]+verts[1].co[1])/2
z = (verts[0].co[2]+verts[1].co[2])/2
verts[0].co[1] = y
verts[1].co[1] = y
verts[0].co[2] = z
verts[1].co[2] = z
verts[0].co[0] = x if verts[0].co[0]>0 else -x
verts[1].co[0] = x if verts[1].co[0]>0 else -x
bpy.ops.object.mode_set(mode='EDIT')
return {'FINISHED'}
#end invoke
def register() :
bpy.utils.register_class(Make)
bpy.utils.register_class(MakerPanel)
def unregister() :
bpy.utils.unregister_class(Make)
bpy.utils.unregister_class(MakerPanel)
if __name__ == "__main__" :
register()
s x 0 -- сплюснуть группу вертексов по оси Х.
s y 0 -- сплюснуть группу вертексов по оси Y.
s z 0 -- сплюснуть группу вертексов по оси Z.
s y 0 -- сплюснуть группу вертексов по оси Y.
s z 0 -- сплюснуть группу вертексов по оси Z.
Михаил Портнягин
Я знаю, спасибо. Но это долго и муторно. Хотелось бы оформить это в виде кнопки на панели инструментов - нажал и выделенные точки сами выровнялись. "s x 0 -- сплюснуть группу вертексов по оси Х" - это не подходит как раз таки, ведь модель станет плоской по Х. Мне нужно чтобы по Х точки получали одинаковые координаты, но с разными знаками
Похожие вопросы
- Как выделить вершины по факту, а не те что в кадре Blender
- 1) Напишите программу, которая будет принимать числа от пользователя и суммировать их, пока он не напишет слово «sum».
- Можно ли такое написать на компьютерном языке PYTHON
- нужно написать задачи на питоне
- С++ написать код для техникума.
- НАПИШИТЕ СРОЧНО КОД НА PYTHON!
- программисты, заходите) нужно написать игру "Четыре в ряд", как изобразить игральное поле?
- Написать функцию. Помогите пожалуйста!
- Неверо написана программа на Python
- Помогите с Python, что я тут не правильно написал? Это займет максимум 2 минуты