{"id":80,"date":"2016-04-03T18:42:56","date_gmt":"2016-04-03T17:42:56","guid":{"rendered":"https:\/\/www.clodo.it\/blog\/?p=80"},"modified":"2024-04-09T16:02:11","modified_gmt":"2024-04-09T15:02:11","slug":"omnidirectional-stereo-ods-with-pov-ray","status":"publish","type":"post","link":"https:\/\/www.clodo.it\/blog\/omnidirectional-stereo-ods-with-pov-ray\/","title":{"rendered":"Omni\u00addirectional stereo (ODS) with POV-Ray"},"content":{"rendered":"<p>Omni\u00addirectional stereo (ODS) is a projection model for stereo 360 degree videos<br \/>\nIt\u2019s designed for VR viewing with a head\u00admounted display (HMD).<br \/>\nMore information <a href=\"https:\/\/developers.google.com\/cardboard\/jump\/rendering-ods-content.pdf\">here<\/a>.<\/p>\n<p>I developed and tested for fun an approach for raytracing, open-source <a href=\"povray.org\">POV-Ray<\/a> software.<\/p>\n<h3>How to render<\/h3>\n<p>Currently (2016-03-11), render ODS image require an alpha version of POV-Ray, that support user_defined camera. Download from <a href=\"https:\/\/github.com\/POV-Ray\/povray\/releases\/tag\/v3.7.1-alpha.8509766%2Bav119\">here<\/a><br \/>\nOr use <a href=\"https:\/\/github.com\/Clodo76\/povray\">my POV-Ray fork<\/a>. More information on this below.<\/p>\n<p>With POV-Ray official (Alpha),<br \/>\nUse the following code for an ODS top-bottom (left eye on top, right eye on bottom):<\/p>\n<pre>\/\/ ODS Top\/Bottom - Docs: https:\/\/www.clodo.it\/blog\/?p=80\n#declare odsIPD = 0.065; \/\/ Interpupillary distance\n#declare odsVerticalModulation = 0.2; \/\/ Use 0.0001 if you don't care about Zenith &amp; Nadir zones.\n#declare odsLocationX = 0;\n#declare odsLocationY = 0;\n#declare odsLocationZ = 0;\n#declare odsHandedness = -1; \/\/ \"-1\" for left-handed or \"1\" for right-handed\n#declare odsAngle = 0; \/\/ Rotation, clockwise, in degree. \n\ncamera {\n  user_defined\n  location {\n    function { odsLocationX + cos(((x+0.5+odsAngle\/360)) * 2 * pi - pi)*(odsIPD\/2*pow(abs(sin(select(y, 1-2*(y+0.5), 1-2*y)*pi)), odsVerticalModulation))*select(-y,-1,+1) }\n    function { odsLocationY }\n    function { odsLocationZ + sin(((x+0.5+odsAngle\/360)) * 2 * pi - pi)*(odsIPD\/2*pow(abs(sin(select(y, 1-2*(y+0.5), 1-2*y)*pi)), odsVerticalModulation))*select(-y,-1,+1) * odsHandedness }\n  }\n  direction {\n    function { sin(((x+0.5+odsAngle\/360)) * 2 * pi - pi) * cos(pi \/ 2 -select(y, 1-2*(y+0.5), 1-2*y) * pi) }\n    function { sin(pi \/ 2 - select(y, 1-2*(y+0.5), 1-2*y) * pi) }\n    function { -cos(((x+0.5+odsAngle\/360)) * 2 * pi - pi) * cos(pi \/ 2 -select(y, 1-2*(y+0.5), 1-2*y) * pi) * odsHandedness }\n  }\n}\n<\/pre>\n<p>Use the following code for an ODS side-by-side:<\/p>\n<pre>\/\/ ODS Side-by-Side - Docs: https:\/\/www.clodo.it\/blog\/?p=80\n#declare odsIPD = 0.065; \/\/ Interpupillary distance\n#declare odsVerticalModulation = 0.2; \/\/ Use 0.0001 if you don't care about Zenith &amp; Nadir zones.\n#declare odsLocationX = 0;\n#declare odsLocationY = 0;\n#declare odsLocationZ = 0;\n#declare odsHandedness = -1; \/\/ \"-1\" for left-handed or \"1\" for right-handed\n#declare odsAngle = 0; \/\/ Rotation, clockwise, in degree. \n\ncamera {\n  user_defined\n  location {\n    function {  odsLocationX + cos(((select(x,2*(x+0.5),2*x)+odsAngle\/360)) * 2 * pi - pi)*(odsIPD\/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*select(x,-1,1) }\n    function {  odsLocationY }\n    function {  odsLocationZ + sin(((select(x,2*(x+0.5),2*x)+odsAngle\/360)) * 2 * pi - pi)*(odsIPD\/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*select(x,-1,1) * odsHandedness }\n  }\n  direction {\n    function {  sin(((select(x,2*(x+0.5),2*x)+odsAngle\/360)) * 2 * pi - pi) * cos(pi \/ 2 -(1-(y+0.5)) * pi) }\n    function {  sin(pi \/ 2 - (1-(y+0.5)) * pi) }\n    function {  -cos(((select(x,2*(x+0.5),2*x)+odsAngle\/360)) * 2 * pi - pi) * cos(pi \/ 2 -(1-(y+0.5)) * pi) * odsHandedness }\n  }\n}     \n<\/pre>\n<p>Use the following code for single eye rendering:<\/p>\n<pre>\/\/ ODS Single Eye - Docs: https:\/\/www.clodo.it\/blog\/?p=80\n#declare odsIPD = 0.065; \/\/ Interpupillary distance     \n#declare odsVerticalModulation = 0.2; \/\/ Use 0.0001 if you don't care about Zenith &amp; Nadir zones.\n#declare odsLocationX = 0;\n#declare odsLocationY = 0;\n#declare odsLocationZ = 0;\n#declare odsHandedness = -1; \/\/ \"-1\" for left-handed or \"1\" for right-handed\n#declare odsAngle = 0; \/\/ Rotation, clockwise, in degree.              \n#declare odsEye = -1; \/\/ -1 for Left eye, +1 for Right eye\n\ncamera {\n  user_defined\n  location {\n    function {  odsLocationX + cos(((x+0.5+odsAngle\/360)) * 2 * pi - pi)*(odsIPD\/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*odsEye }\n    function {  odsLocationY }\n    function {  odsLocationZ + sin(((x+0.5+odsAngle\/360)) * 2 * pi - pi)*(odsIPD\/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*odsEye * odsHandedness }\n  }\n  direction {\n    function {  sin(((x+0.5+odsAngle\/360)) * 2 * pi - pi) * cos(pi \/ 2 -(1-(y+0.5)) * pi) }\n    function {  sin(pi \/ 2 - (1-(y+0.5)) * pi) }\n    function {  -cos(((x+0.5+odsAngle\/360)) * 2 * pi - pi) * cos(pi \/ 2 -(1-(y+0.5)) * pi) * odsHandedness }\n  }\n}                               \n<\/pre>\n<h3>Caveats<\/h3>\n<ul>\n<li>Camera Direction is actually not supported. It&#8217;s always look_at&lt;0,0,1&gt;. You can use the <b>odsAngle<\/b> parameter for a rotation (degree) around Y axis.<\/li>\n<li>Zenith &amp; Nadir Zones<br \/>\nBase ODS algorithm have spiral\/singularities towards the zenith and nadir points.To avoid that, i modulate the stereoscopic eye separation such that it begins at normal eye separation near the horizon, and is smoothly decreased, reaching zero by the time either the zenith or nadir points on the polar axis are visible to the user, producing a monoscopic image.&nbsp;<\/p>\n<p>I use <a href=\"https:\/\/www.wolframalpha.com\/input\/?i=0.065*pow(sin((x%2B0.5)*pi),0.02)+range+-0.5..0.5\">this formula<\/a>:<\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" src=\"https:\/\/www.clodo.it\/host\/images\/6e41e564bc22c2fd52fc2bae1007e02227792e64.png\"><\/div>\n<p>where 0.02 it&#8217;s the <b>odsVerticalModulation<\/b> and 0.065 the default <b>IPD<\/b>. Play with this value to understand how IPD are reduced near the Zenith (x:-0.5) and Nadir (x:0.5).<\/p>\n<p>In general, it&#8217;s recommended to avoid objects at zenith &amp; nadir points, and use a <b>odsVerticalModulation<\/b> near <b>0<\/b> (0.0001), to obtain a perfect IPD \/ 3d effect.<br \/>\nIf you have objects at zenith &amp; nadir points, use a <b>odsVerticalModulation<\/b> near <b>1<\/b> can be a good compromise.<\/p>\n<p>Other approach:<br \/>\nDomemaster3D (Shader for 3DS Max, Mata, Softimage etc) recommend a texture to reduce the effect. <a href=\"http:\/\/www.andrewhazelden.com\/blog\/2014\/10\/render-spherical-stereo-content-with-the-domemaster3d-v1-6-alpha\/\">link<\/a><\/p>\n<p>SolidAngle\/Arnold use mixed approach. <a href=\"http:\/\/pedrofe.com\/oculus-camera\/\">link<\/a><\/p>\n<p>Another kind of modulation: <a href=\"https:\/\/www-s.ks.uiuc.edu\/Publications\/Papers\/paper.cgi?tbcode=STON2016A\">link<\/a><\/li>\n<\/ul>\n<h3>Best practice<\/h3>\n<ul>\n<li>Objects should remain at least 60cm from the camera (relative to an IPD of 6.5cm).<br \/>\nUse this POV-Ray code to check (it&#8217;s auto adapt based on IPD):&nbsp;<\/p>\n<pre>sphere\n{\n  &lt;odsLocationX,odsLocationY,odsLocationZ&gt;, 0.6*odsIPD\/0.065\n  pigment\n  {\n    color &lt;1,0,0&gt;\n    filter 0.97\n  }\n  hollow\n}\n<\/pre>\n<\/li>\n<li>Objects appearing directly above or below the camera should remain at least 3.5m from the camera (relative to an IPD of 6.5cm).<\/li>\n<li>Antialiasing is very very very important on VR headset.<\/li>\n<\/ul>\n<h3>Recommended Resolutions<\/h3>\n<p>I recommend, at least for the current (year 2016) generation of VR headset (GearVR, Oculus Rift, HTC Vive), at least 6480 x 6480 pixels in top\/bottom for static images. For videos, see below.<\/p>\n<p>Resolution must have 2:1 aspect ratio (standard equirectangular), that become 4:1 for side-by-side or 1:1 for a top-bottom.<\/p>\n<p>TL;DR;<br \/>\nIt&#8217;s difficult to estimate a good resolution.<br \/>\nVR headset do a distortion for lenses, any every VR headset can have different lenses, different FOV, different panel resolution etc.<\/p>\n<p>The GearVR for example has a 90\u00b0 FOV on a 2560&#215;1440 panel, but the center pixel covers 0.06\u00b0 after distortion. This value is sometime called &#8220;pixel coverage&#8221; or &#8220;pixel density&#8221; or &#8220;pixel per display pixel&#8221; or &#8220;eye buffer scaling&#8221;. So, for the GearVR, 0.06\u00b0 pixels means we need 360\/0.06 = 6000 pixels to cover one monoscopic turn.<\/p>\n<h3>Rendering Animation\/Video<\/h3>\n<p>This is actually problematic.<\/p>\n<p>In theory, the resolution must be at least as explained above for images.<\/p>\n<p>Any VR headset require a high frame-rate to avoid nausea.<\/p>\n<ul>\n<li>Oculus Rift DK2 (Development Kit 2): 75 FPS<\/li>\n<li>Oculus Rift CV1 (Customers Version 1): 90 FPS<\/li>\n<li>HTC Vive: 90 FPS<\/li>\n<li>Sony Playstation PSVR : 120 FPS<\/li>\n<\/ul>\n<p>In general, future-generation VR headset: expected 120 FPS<\/p>\n<p>But <a href=\"https:\/\/en.wikipedia.org\/wiki\/H.264\/MPEG-4_AVC#Levels\">H264<\/a> don&#8217;t have any level profile compatible with this kind of resolution.<br \/>\nAlso <a href=\"https:\/\/en.wikipedia.org\/wiki\/High_Efficiency_Video_Coding#Tiers_and_levels\">HEVC\/H265<\/a> have the same problem.<\/p>\n<p>But we also need a coded that is hardware-accelerated to obtain the high FPS requested, and generally only H264\/H265 are optimized for this.<\/p>\n<h3>VR Players<\/h3>\n<p><a href=\"http:\/\/www.vrdesktop.net\">Virtual Desktop<\/a> &#8211; There isn&#8217;t any option about side-by-side vs top-bottom, it simply detect it from the aspect ratio: 4:1 for side-by-side, 1:1 for top\/bottom.<\/p>\n<p><a href=\"http:\/\/www.supersinfulsilicon.com\/maxvr.html\">MaxVR<\/a><\/p>\n<p>Both player can&#8217;t reproduce H265 high resolution videos.<\/p>\n<h3>My POV-Ray fork on GIT-Hub<\/h3>\n<p>With a POV-Ray <a href=\"https:\/\/github.com\/Clodo76\/povray\">builded from my fork<\/a>, you can simply use a spherical camera:<\/p>\n<pre>camera\n{             \n  spherical   \n  \/\/ipd 0.065\n  ods 4 \n  \/\/ods_angle 0\n  \/\/ods_modulation 0.2\n  \/\/ods_handedness 1\n  location &lt;0,0,0&gt;  \n}             \n<\/pre>\n<ul>\n<li><b>ods<\/b>: 0 for monoscopic image, 1 for left eye only, 2 for right eye only, 3 for side-by-side, 4 for top\/bottom. 0 is default. 4 recommended.<\/li>\n<li>Other parameters <b>ipd<\/b>, <b>ods_angle<\/b>, <b>ods_modulation<\/b> and <b>ods_handedness<\/b> are the same of the user_defined approach param described above.<\/li>\n<\/ul>\n<h3>Interesting Links<\/h3>\n<ul>\n<li><a href=\"http:\/\/news.povray.org\/povray.general\/thread\/%3Cweb.56d38071f91c97bb4e8811590%40news.povray.org%3E\/\">POV-Ray newsgroup, topic about the approach<\/a><\/li>\n<li><a href=\"http:\/\/news.povray.org\/povray.text.scene-files\/thread\/%3Cweb.56e05da626a7967a4e8811590%40news.povray.org%3E\/\">POV-Ray newsgroup, topic about contents<\/a><\/li>\n<li><a href=\"https:\/\/forums.oculus.com\/community\/discussion\/30854\/\">Oculus Forum Topic<\/a><\/li>\n<li><a href=\"https:\/\/community.renderman.pixar.com\/article\/991\/rendering-for-vr.html\">Renderman\/Pixar approach<\/a><\/li>\n<li><a href=\"http:\/\/bernieroehl.com\/prerendered_spherical_stereoscopic_panoramas\/\">Bernie Roehl POV-Ray approach<\/a><\/li>\n<li><a href=\"https:\/\/code.blender.org\/2015\/03\/1451\/\">Blender approach<\/a><\/li>\n<li><a href=\"https:\/\/scottsingercg.wordpress.com\/2015\/11\/24\/spherical-stereo-camera-for-emersive-rendering\/\">Scott Singer approach<\/a><\/li>\n<\/ul>\n<h3>Kudos<\/h3>\n<p>Many, many thanks to:<\/p>\n<p>Christoph Lipka, William F Pokorny, Jaime Vives Piqueres from POV-Ray newsgroup.<br \/>\nJoan from Oculus Forum.<br \/>\nJakob Flierl (checkout is <a href=\"https:\/\/github.com\/koppi\/pov-ods\">GIT-Hub repo<\/a> about ODS).<\/p>\n<h3>Examples of rendering<\/h3>\n<p>Some example of rendering (6480 x 6480 pixels, Top-Bottom).<\/p>\n<div style=\"text-align: center;\"><a download=\"\" href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/mirrors_20160322.jpg\">Mirrors<\/a> &#8211; I made this<br \/>\n<a href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/mirrors_20160322.jpg\"><img decoding=\"async\" class=\"boxed\" src=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/mirrors_20160316_thumb.jpg\"><\/a><br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nStacker Day &#8211; POV-Ray sample scene adapted for ODS<br \/>\n<a href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/stackerday_20160322.jpg\"><img decoding=\"async\" class=\"boxed\" src=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/stackerday_20160316_thumb.jpg\"><\/a><br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nFractals 1 &#8211; POV-Ray sample scene adapted for ODS<br \/>\n<a href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/fractals1_20160322.jpg\"><img decoding=\"async\" class=\"boxed\" src=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/fractals1_20160316_thumb.jpg\"><\/a><br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nFractals 2 &#8211; POV-Ray sample scene adapted for ODS<br \/>\n<a href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/fractals2_20160322.jpg\"><img decoding=\"async\" class=\"boxed\" src=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/fractals2_20160316_thumb.jpg\"><\/a><br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nWineglass &#8211; POV-Ray sample scene adapted for ODS<br \/>\n<a href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/wineglass_20160322.jpg\"><img decoding=\"async\" class=\"boxed\" src=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/wineglass_20160316_thumb.jpg\"><\/a><br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nAxis &#8211; Test reference<br \/>\n<a href=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/axis_20160322.jpg\"><img decoding=\"async\" class=\"boxed\" src=\"https:\/\/www.clodo.it\/files\/projects\/povray_ods\/axis_20160320_thumb.jpg\"><\/a><\/div>\n<p>I also rendered a <a href=\"https:\/\/www.clodo.it\/blog\/?p=102\">sample video<\/a> that can be used for stress-testing of VR video players.<\/p>\n<h3>QUICKRES.INI<\/h3>\n<p>Reference resolutions for POV-Ray <b>quickres.ini<\/b><\/p>\n<pre>[ODS TB Quick Test - 512 x 512]\nWidth=512\nHeight=512\nAntialias=Off\n\n[ODS TB Test - 1024 x 1024]\nWidth=1024\nHeight=1024\nAntialias=Off\n\n[ODS TB Minimum - 3600 x 3600]\nWidth=3600\nHeight=3600\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB High - 6480 x 6480]\nWidth=6480\nHeight=6480\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB Ultra - 12288 x 12288]\nWidth=12288\nHeight=12288\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB 1440p - 2560 x 1440]\nWidth=2560\nHeight=1440\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB UHD-1 2160p - 3840 x 2160]\nWidth=3840\nHeight=2160\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB DCI 4K - 4096 x 2160]\nWidth=4096\nHeight=2160\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB 8K UHD - 7680 x 4320]\nWidth=7680\nHeight=4320\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS LR Minimum - 7200 x 1800]\nWidth=7200\nHeight=1800\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS LR High - 12960 x 3240]\nWidth=12960\nHeight=3240\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS LR Ultra - 24576 x 6144]\nWidth=24576\nHeight=6144\nAntialias=On\nAntialias_Threshold=0.3\n[ODS LR Low - 7200 x 1800]\nWidth=7200\nHeight=1800\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS LR Normal - 12960 x 3240]\nWidth=12960\nHeight=3240\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS LR High - 24576 x 6144]\nWidth=24576\nHeight=6144\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB Low - 3600 x 3600]\nWidth=3600\nHeight=3600\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB Normal - 6480 x 6480]\nWidth=6480\nHeight=6480\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB High - 12288 x 12288]\nWidth=12288\nHeight=12288\nAntialias=On\nAntialias_Threshold=0.3\n\n[ODS TB YouTube - 3840 x 2160]\nWidth=3840\nHeight=2160\nAntialias=On\nAntialias_Threshold=0.3\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Omni\u00addirectional stereo (ODS) is a projection model for stereo 360 degree videos It\u2019s designed for VR viewing with a head\u00admounted display (HMD). More information here. I developed and tested for fun an approach for raytracing, open-source POV-Ray software. How to render Currently (2016-03-11), render ODS image require an alpha version of POV-Ray, that support user_defined &hellip; <a href=\"https:\/\/www.clodo.it\/blog\/omnidirectional-stereo-ods-with-pov-ray\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Omni\u00addirectional stereo (ODS) with POV-Ray<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":481,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,3,7],"tags":[],"uagb_featured_image_src":{"full":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods.jpg",1328,749,false],"thumbnail":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods-150x150.jpg",150,150,true],"medium":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods-300x169.jpg",300,169,true],"medium_large":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods-768x433.jpg",660,372,true],"large":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods-1024x578.jpg",660,373,true],"1536x1536":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods.jpg",1328,749,false],"2048x2048":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods.jpg",1328,749,false],"post-thumbnail":["https:\/\/www.clodo.it\/blog\/wp-content\/uploads\/2016\/04\/feature-povray-ods-825x510.jpg",825,510,true]},"uagb_author_info":{"display_name":"Clodo","author_link":"https:\/\/www.clodo.it\/blog\/author\/clodo\/"},"uagb_comment_info":3,"uagb_excerpt":"Omni\u00addirectional stereo (ODS) is a projection model for stereo 360 degree videos It\u2019s designed for VR viewing with a head\u00admounted display (HMD). More information here. I developed and tested for fun an approach for raytracing, open-source POV-Ray software. How to render Currently (2016-03-11), render ODS image require an alpha version of POV-Ray, that support user_defined&hellip;","_links":{"self":[{"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/posts\/80"}],"collection":[{"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/comments?post=80"}],"version-history":[{"count":34,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/posts\/80\/revisions"}],"predecessor-version":[{"id":419,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/posts\/80\/revisions\/419"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/media\/481"}],"wp:attachment":[{"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/media?parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/categories?post=80"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.clodo.it\/blog\/wp-json\/wp\/v2\/tags?post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}