4
$\begingroup$

Can such frames/videos be rendered in Blender Internal as well? If not, how indirectly?

EDIT: The below solution is great as long as you can write your own Python script and only render solid objects. When you need things like particles/hair, it won't work as those won't be reflected.

$\endgroup$
7
  • $\begingroup$ It would be possible to bake the scene onto a sphere and repeat it for every frame. $\endgroup$
    – Denis
    Aug 28, 2015 at 15:45
  • $\begingroup$ How do you do that? Repeating that for every frame could be achieved by a Python two liner I think. $\endgroup$
    – Leo Ervin
    Aug 29, 2015 at 5:54
  • $\begingroup$ Yes that is easy to do with a sphere with a shadeless material with full reflection, and a texture set tho the sphere with the resolution of the video you want to make, I assume repeating the process with python for each frame should be easy too, but that's beyond my knowledge. $\endgroup$
    – Denis
    Aug 29, 2015 at 16:46
  • $\begingroup$ You mean an inverted (normals) sphere, large enough to fill the whole volume, UV mapped accordingly? I'm not sure I understand, will I need to fetch the generated texture instead of camera render? $\endgroup$
    – Leo Ervin
    Aug 29, 2015 at 20:15
  • $\begingroup$ The sphere should be very small at the location where the camera supposed to be, and then with python you can bake the result for every frame. I can post a partial answer without the python part. $\endgroup$
    – Denis
    Aug 29, 2015 at 20:35

2 Answers 2

5
$\begingroup$

First create a sphere and in edit mode select the triangular fans on the poles of the sphere and inset to very small size using I button and delete the triangular fans leaving very small holes on the poles.

enter image description here

Then unwrap the sphere using follow active quads, position and scale the UVs to fit the UV/Image editor window. Once the sphere is unwrapped add a new texture with video resolution you want (1920x1080)

enter image description here

Then add a material to the sphere, enable Shadeless, Mirror and set Reflectivity to 1

enter image description here

Then scale the sphere to small size and position it where the camera should be and add Subsurf modifier with at least 2 subdivisions to reduce texture distortion.

Once all the steps are finished you can use the python script to bake the textures for each frame in a sequence.

$\endgroup$
7
  • $\begingroup$ Very odd deformations when doing this. i.imgur.com/fHXxry2.png Maybe the mirror quality can and has to be changed somewhere. $\endgroup$
    – Leo Ervin
    Aug 29, 2015 at 23:08
  • $\begingroup$ Thats how it should look like but you need to make an image wider, like the video output you want. $\endgroup$
    – Denis
    Aug 29, 2015 at 23:13
  • $\begingroup$ Oh, and I forgot to add, to reduce the image distortion add Subsurf modifier with at least 2 subdivisions and set it to smooth shading. $\endgroup$
    – Denis
    Aug 29, 2015 at 23:15
  • $\begingroup$ Looks better. Any chance antialiasing can be enabled for mirror texture? $\endgroup$
    – Leo Ervin
    Aug 29, 2015 at 23:24
  • $\begingroup$ @LeoErvin I'm not sure if this option exist for baking $\endgroup$
    – Denis
    Aug 29, 2015 at 23:41
2
$\begingroup$

I'm sure with a minor edit this script, combined with the above solution, will allow to render an equirectangular animation or frame in in Blender Internal:

import bpy

# remember current frame to switch back after the script is finished
current_frame = bpy.context.scene.frame_current

mesh = bpy.context.scene.objects.active.data

for i in range(bpy.context.scene.frame_start, bpy.context.scene.frame_end+1):
    # set current frame
    bpy.context.scene.frame_current = i

    # create an image which will store the baked data
    image = bpy.data.images.new(str(i)+'.png', bpy.context.scene.render.resolution_x, bpy.context.scene.render.resolution_y, alpha = 0)
    image.file_format = 'PNG'
    image.filepath = "//"+str(i)+".png"

    #set the active image for each uv:
    for uvface in mesh.uv_textures.active.data:
        uvface.image = image

    # bake
    bpy.ops.object.bake(type='COMBINED')

    # resave image with baked data
    image.save()

    print ("Frame "+str(i)+" complete")

# switch back to the frame you were on before running this code
bpy.context.scene.frame_current = current_frame

Currently it gives this error:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\internal.blend\Text", line 22, in <module>
  File "C:\Program Files\Blender Foundation\Blender\2.75\scripts\modules\bpy\ops
.py", line 189, in __call__
    ret = op_call(self.idname_py(), None, kw)
RuntimeError: Error: No active image found in material "Material.002" (0) for ob
ject "Sphere"

If someone can tell how to set the "active image" for a Material, then I think this script will run fine.

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .