import bpy import bmesh from math import sqrt, cos, sin import numpy as np from mathutils import Vector def draw_vec(v,c): # Create a new mesh mesh = bpy.data.meshes.new("vector") # Create a bmesh to add vertices and faces to bm = bmesh.new() norm = sqrt(v[0]**2+v[1]**2+v[2]**2) sv = np.array(v)/norm*(norm-0.1) v1 = () v2 = () v3 = () v4 = () norm2 =0 if(v[0]!=0 or v[1]!=0): norm2= sqrt(v[1]**2+v[0]**2) v1 = np.array((-v[1],v[0],0))/norm2*0.1 v2 = np.array((v[1],-v[0],0))/norm2*0.1 else: norm2 = sqrt(v[2]**2+v[1]**2) v1 = np.array((0,v[2],-v[1]))/norm2*0.1 v2 = np.array((0,-v[2],v[1]))/norm2*0.1 v3 = Vector((v[1]*v1[2]-v[2]*v1[1], v[2]*v1[0]-v[0]*v1[2], v[0]*v1[1] - v[1]*v1[0])).normalized()*0.1 v4 = -v3 v5 = (sv[0]+v1[0],sv[1]+v1[1], sv[2]+v1[2]) v6 = (sv[0]+v2[0],sv[1]+v2[1], sv[2]+v2[2]) v7 = (sv[0]+v3[0],sv[1]+v3[1], sv[2]+v3[2]) v8 = (sv[0]+v4[0],sv[1]+v4[1], sv[2]+v4[2]) bv1 = bm.verts.new(v1) bv2 = bm.verts.new(v2) bv3 = bm.verts.new(v3) bv4 = bm.verts.new(v4) bv5 = bm.verts.new(v5) bv6 = bm.verts.new(v6) bv7 = bm.verts.new(v7) bv8 = bm.verts.new(v8) bv = bm.verts.new(v) #v cross (-v[1]/norm, v[0]/norm, 0)=(-v[2]*v[0]/norm, -v[2]*v[1]/norm, v[0]*v[0]/norm + v[1]*v[1]/norm) #a cross b = (-a_3b_2, a_3b_1, a_1b_2-a_2b_1) bm.faces.new((bv1,bv3,bv2,bv4)) bm.faces.new((bv1,bv3,bv7,bv5)) bm.faces.new((bv3,bv2,bv6,bv7)) bm.faces.new((bv2,bv4,bv8,bv6)) bm.faces.new((bv4,bv1,bv5,bv8)) bm.faces.new((bv5,bv7,bv6,bv8)) bm.faces.new((bv5,bv7,bv)) bm.faces.new((bv7,bv6,bv)) bm.faces.new((bv6,bv8,bv)) bm.faces.new((bv8,bv5,bv)) # Update the bmesh and create a mesh from it bm.to_mesh(mesh) bm.free() # Create a new object for the mesh obj = bpy.data.objects.new("my UV sphere", mesh) # Create a new material material = bpy.data.materials.new(name="MyMaterial") # Set the base color of the material material.diffuse_color = c # these are (R, G, B, Alpha) obj.data.materials.append(material) # Link the object to the scene scene = bpy.context.scene scene.collection.objects.link(obj) u = np.array((1,1,0)) v = np.array((0,1,0)) w = np.cross(u,v) draw_vec(u,(1,0,0,1)) draw_vec(v,(0,1,0,1)) draw_vec(w,(0,0,1,1))