I am pretty much new in the Blender World, coming from Web-Development mainly and got yesterday into Blender Scripting, so I can present you here my first Plugin:
TriLightning.png
1182×898 61.3 KB
3-Way Lighting
Adds 3 Lamps from different, customizable Angles to the Scene
Placement is related to the Keyobject (Must be selected!) and the active Camera
You can set Contrast, Height, Distance, LampType and also the Baseenergy
Contrast: 0-100%: The Percentage of the Baseenergy which the Background+Filllight has
-100%-0: Opposite effect, here the Keylight gets the percentage of the Baseenergy
The other options should be pretty much clear, please keep in mind that you have to select an Object when adding this, since it uses it for the Distance calculation and such.
Where can I add the Tri-Lighting?
Object Mode -> Object Tools -> “Add Tri-Lighting”
How to Install:
Drag it in your Addons Folder and activate over “Object -> Tri-Lighting”
What you can do?
Give me some Feedback and also some Feature Ideas!
Thanks also to the people from
#blender
and
#blendercoders
for the Ideas and coding help!
Traceback (most recent call last):
File “C:\Programi\b272\2.72\scripts\modules\addon_utils.py”, line 312, in enable
mod.register()
File “C:\Users\se\AppData\Roaming\Blender Foundation\Blender\2.72\scripts\addons rilighting.py”, line 159, in register
bpy.types.VIEW3D_PT_tools_objectmode.append(panel_func)
AttributeError: ‘RNA_Types’ object has no attribute ‘VIEW3D_PT_tools_objectmode’
Fix it for 2.72
need a new notation for location
old one: bpy.types.VIEW3D_PT_tools_objectmode.append(panel_func)
new one: bpy.types.VIEW3D_PT_tools_object.append(panel_func)
better: bpy.types.VIEW3D_PT_tools_add_object.append(panel_func)
bl_info = {
"name": "Tri-Lighting Creator",
"category": "Object",
"author": "Daniel Schalla",
"version": (1, 0),
"blender": (2, 68, 0),
"location": "Object Mode > Toolbar > Create > Add Primitiv > Add Tri-Lighting",
"description": "Add 3 Point Lighting to selected Object"
import bpy
import mathutils
from bpy.props import *
import math
class TriLighting(bpy.types.Operator):
"""TriL ightning"""
bl_idname = "object.trilighting" # unique identifier for buttons and menu items to reference.
bl_label = "Tri-Lighting Creator" # display name in the interface.
bl_options = {'REGISTER', 'UNDO'} # enable undo for the operator.
height = bpy.props.FloatProperty(name="Height", default=5)
distance = bpy.props.FloatProperty(name="Distance",default=5,min=0.1,subtype="DISTANCE")
energy = bpy.props.IntProperty(name="Base Energy",default=3,min=1)
contrast = bpy.props.IntProperty(name="Contrast",default=50,min=-100,max=100,subtype="PERCENTAGE")
leftangle = bpy.props.IntProperty(name="Left Angle", default=26, min=1, max=90, subtype="ANGLE")
rightangle = bpy.props.IntProperty(name="Right Angle", default=45, min=1, max=90, subtype="ANGLE")
backangle = bpy.props.IntProperty(name="Back Angle", default=235, min=90, max=270, subtype="ANGLE")
Light_Type_List = [('POINT','Point','Point Light'),
('SUN','Sun','Sun Light'),
('SPOT','Spot','Spot Light'),
('HEMI','Hemi','Hemi Light'),
('AREA','Area','Area Light')]
primarytype = EnumProperty( attr='tl_type',
name='Key Type',
description='Choose the type off Key Light you would like',
items = Light_Type_List, default = 'HEMI')
secondarytype = EnumProperty( attr='tl_type',
name='Fill+Back Type',
description='Choose the type off secondary Light you would like',
items = Light_Type_List, default = 'POINT')
def execute(self, context):
scene = context.scene
view = context.space_data
if view.type == 'VIEW_3D' and not view.lock_camera_and_layers:
camera = view.camera
else:
camera = scene.camera
if (camera is None):
cam_data= bpy.data.cameras.new(name='Camera')
cam_obj = bpy.data.objects.new(name='Camera',object_data=cam_data)
scene.objects.link(cam_obj)
scene.camera=cam_obj
bpy.ops.view3d.camera_to_view()
camera=cam_obj
bpy.ops.view3d.viewnumpad(type='TOP')
obj = bpy.context.scene.objects.active
#####Calculate Energy for each Lamp
if(self.contrast>0):
keyEnergy=self.energy
backEnergy=(self.energy/100)*abs(self.contrast)
fillEnergy=(self.energy/100)*abs(self.contrast)
else:
keyEnergy=(self.energy/100)*abs(self.contrast)
backEnergy=self.energy
fillEnergy=self.energy
print(self.contrast)
#####Calculate Direction for each Lamp
#Calculate current Distance and get Delta
obj_position=obj.location
cam_position=camera.location
delta_position=cam_position-obj_position
vector_length=math.sqrt((pow(delta_position.x,2)+pow(delta_position.y,2)+pow(delta_position.z,2)))
single_vector=(1/vector_length)*delta_position
#Calc back position
singleback_vector=single_vector.copy()
singleback_vector.x=math.cos(math.radians(self.backangle))*single_vector.x+(-math.sin(math.radians(self.backangle))*single_vector.y)
singleback_vector.y=math.sin(math.radians(self.backangle))*single_vector.x+(math.cos(math.radians(self.backangle))*single_vector.y)
backx=obj_position.x+self.distance*singleback_vector.x
backy=obj_position.y+self.distance*singleback_vector.y
backData = bpy.data.lamps.new(name="TriLamp-Back", type=self.secondarytype)
backData.energy=backEnergy
backLamp = bpy.data.objects.new(name="TriLamp-Back", object_data=backData)
scene.objects.link(backLamp)
backLamp.location = (backx, backy, self.height)
trackToBack=backLamp.constraints.new(type="TRACK_TO")
trackToBack.target=obj
trackToBack.track_axis="TRACK_NEGATIVE_Z"
trackToBack.up_axis="UP_Y"
#Calc right position
singleright_vector=single_vector.copy()
singleright_vector.x=math.cos(math.radians(self.rightangle))*single_vector.x+(-math.sin(math.radians(self.rightangle))*single_vector.y)
singleright_vector.y=math.sin(math.radians(self.rightangle))*single_vector.x+(math.cos(math.radians(self.rightangle))*single_vector.y)
rightx=obj_position.x+self.distance*singleright_vector.x
righty=obj_position.y+self.distance*singleright_vector.y
rightData = bpy.data.lamps.new(name="TriLamp-Fill", type=self.secondarytype)
rightData.energy=fillEnergy
rightLamp = bpy.data.objects.new(name="TriLamp-Fill", object_data=rightData)
scene.objects.link(rightLamp)
rightLamp.location = (rightx, righty, self.height)
trackToRight=rightLamp.constraints.new(type="TRACK_TO")
trackToRight.target=obj
trackToRight.track_axis="TRACK_NEGATIVE_Z"
trackToRight.up_axis="UP_Y"
#Calc left position
singleleft_vector=single_vector.copy()
singleleft_vector.x=math.cos(math.radians(-self.leftangle))*single_vector.x+(-math.sin(math.radians(-self.leftangle))*single_vector.y)
singleleft_vector.y=math.sin(math.radians(-self.leftangle))*single_vector.x+(math.cos(math.radians(-self.leftangle))*single_vector.y)
leftx=obj_position.x+self.distance*singleleft_vector.x
lefty=obj_position.y+self.distance*singleleft_vector.y
leftData = bpy.data.lamps.new(name="TriLamp-Key", type=self.primarytype)
leftData.energy=keyEnergy
leftLamp = bpy.data.objects.new(name="TriLamp-Key", object_data=leftData)
scene.objects.link(leftLamp)
leftLamp.location = (leftx, lefty, self.height)
trackToLeft=leftLamp.constraints.new(type="TRACK_TO")
trackToLeft.target=obj
trackToLeft.track_axis="TRACK_NEGATIVE_Z"
trackToLeft.up_axis="UP_Y"
return {'FINISHED'}
def panel_func(self, context):
self.scn = context.scene
self.layout.label(text="Tri-Lighting:")
self.layout.operator("object.trilighting", text="Add Tri-Lighting")
def register():
bpy.utils.register_class(TriLighting)
bpy.types.VIEW3D_PT_tools_add_object.append(panel_func)
def unregister():
bpy.utils.unregister_class(TriLighting)
bpy.types.VIEW3D_PT_tools_add_object.remove(panel_func)
if __name__ == "__main__":
register()
bkjernisted:
mkbreuer, is your script above the script for the addon that will work in2.72? Do we simply paste what is above in the text editor and save it as a trilighting.py file?
Sorry i forgot the close bracket on the top of the script.
You can copy and past Schallas script into the blender texteditor and save it, as you wrote, as a phyton script > trilighting.py file
I only changed the location for it: Object Mode > Toolbar > Create > Add Primitiv > Add Tri-Lighting
Hello, I tried the addon and I get this error
"Traceback (most recent call last):
File “C:\Users\afranx\AppData\Roaming\Blender Foundation\Blender\2.72\scripts\addons rilighting.py”, line 84, in execute
obj_position=obj.location
AttributeError: ‘NoneType’ object has no attribute ‘location’
location: <unknown location>:-1"
Can you help me?
Hey there,
I am sorry for the late response, I am not using Blender anymore since I lack time, however, I will look into the issue the next 2 weeks
and update the script again.
Regards,
Schalla
SHABA1
hi, just so happens the addon is in Blender 2.79 Advanced Objects Addon.
You can get this by using a nightly build of Blender, or just wait a while longer for 2.79 to be released
Hey Meta was this included with Blender 2.79 ? I cannot seem to find it anywhere.