WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   Transparency gradient for cylinder (https://forum.worldviz.com/showthread.php?t=6185)

peterparker 08-30-2018 08:00 AM

Transparency gradient for cylinder
 
I would like to create simple cylinder with a transparency gradient that lets the object 'fade out' in y-direction.

A Vizard cylinder consists of a configurable number of slices, iirc. Is there any way to access those slices individually?

Jeff 08-31-2018 11:56 PM

The cylinder object does not have any commands to access individual slices. It's building up the object using on-the-fly triangle fans. If you look into the vizshape code, it maybe possible to modify the cylinder object and apply different alpha values as the triangle fans are created. If you have access to 3ds Max, you could export a cylinder with alpha map.

peterparker 09-04-2018 04:45 AM

Jeff, thank you for your reply and the advice.

In the meantime I have created my own slice-based cylinder (100 slices, simply looped code with increasing height offset) with a decreasing alpha. Looks ok-ish for the purpose. I only have one issue with this:

The floor of the experimental space should resemble something like grass. I can't remember how but we ended up with an osgb object imported into the scene. At certain points of the experiment the floor gets rotated to prevent the participants to develop any orientation strategies apart from their actual instructions. And ever time after this rotation of the osgb model my cylinder gets opaque and strangely darkish if viewed from one half of the experimental space. From the other half it maintains its transparency. It does not matter whether the cylinder was present all the time, was set to invisible in the meantime, or got re-created from scratch.

Do you have any idea why this might be and how I could prevent it?


EDIT: And now I understand your above comment: the cylinder does not actually consist of slices, but more like cake pieces (makes sense, determines its roundness). This is why you were talking about fan-like elements.

peterparker 09-05-2018 05:53 AM

Maybe some visuals to illustrate what I mean. the left side shows transparency working. If I rotate the view only a little bit further, it does not work anymore. Basically the question is: do I look in the direction of 180° (left side, working) or 0° (right side, not working).

https://i.imgur.com/dCu9Jf1.pnghttps://i.imgur.com/duYXdzf.png

peterparker 09-05-2018 08:23 AM

Turns out I was wrong. Around the ground rotation event there is a fade-out/fade-in sequence, which manipulates the alpha value of the ground model. This fading process actually is the culprit.

Now I only need to find out, how to fade out the ground without manipulating its alpha. And it would be interesting to understand, why the fading breaks my tube transparency, in the first place.

(sorry for the confusion, this code isn't originally by me)

Jeff 09-05-2018 08:50 AM

Can you post example code that reproduces the issue?

peterparker 09-06-2018 04:23 AM

Code:

import viz, vizshape, vizact
import random


# run script
viz.go()
viz.setMultiSample(4)


# create world
#world = viz.add('spot_rotation_resources/circle_grass_lukas2.osgb')

world = vizshape.addCylinder(.01,50)
#tex = viz.addTexture('GRASS.JPG')
#world.texture(tex)
world.color(viz.GREEN)

light = viz.addLight()
light.setEuler(0,45,0)


# create spot
spot_elevation = .05
spot_height = 2.5
spot_nslices = 1        #originally 100
spot_slice_height = spot_height / spot_nslices
alpha_start = 0.5
alpha_end = 0.0
alpha_step = (alpha_end - alpha_start)/spot_nslices

spot = []

for a in range(spot_nslices):
        cyl = vizshape.addCylinder(height=spot_slice_height, radius=0.30, color=viz.YELLOW, top=None)
        cyl.alpha( alpha_start + a*alpha_step )
        spot_yPos = spot_slice_height/2 + spot_elevation + a*spot_slice_height
        cyl.setPosition([0,spot_yPos,10])
        spot.append(cyl)


# rotate ground
def random_rotate(object_to_rotate, duration):

        rotate_val = random.randint(1, 360)

        spinto = vizact.spinTo(euler=(rotate_val, 0, 0), time=0, mode=viz.REL_GLOBAL)
        fadeout = vizact.fadeTo(0, time=duration)
        fadein = vizact.fadeTo(1, time=duration)

        rotate_action = vizact.sequence(fadeout, spinto, fadein)
        object_to_rotate.addAction(rotate_action)

vizact.onkeydown('r', random_rotate, world, 1)


Also works with
Code:

vizact.onkeydown('s', world.alpha, .9)
instead of the fading action.

peterparker 09-06-2018 04:42 AM

EDIT: I can even use 's' first (see above) and _then_ create the spot. Same result.

Jeff 09-10-2018 09:52 PM

It seems to be an issue with alpha and blending multiple objects. See the limitations and workarounds page here. Try enabling alpha to coverage and disabling blending on each of the cylinder parts and scene model.

peterparker 09-11-2018 01:47 AM

Ok, so I do this for my ground model and for each cylinder slice:

Code:

cyl.enable(viz.SAMPLE_ALPHA_TO_COVERAGE)
cyl.disable(viz.BLEND)

Do I do this before or after setting the alpha value? I have tried both and it seems to not help.

peterparker 09-17-2018 06:41 AM

Jeff, any idea why this does not work for me?

Jeff 09-18-2018 03:22 AM

I'll check with a developer for suggestions.

Jeff 09-19-2018 03:10 AM

The following code works for me. The appearance of the cylinder parts do not change when the ground is faded. I had an issue with the alpha that was fixed after updating my nvidia graphics drivers.

Code:

import viz, vizshape, vizact
import random

viz.setMultiSample(4)
viz.go()

world = viz.addChild('ground.osgb')

light = viz.addLight()
light.setEuler(0,45,0)

# create spot
spot_elevation = .05
spot_height = 2.5
spot_nslices = 4        #originally 100
spot_slice_height = spot_height / spot_nslices
alpha_start = 0.5
alpha_end = 0.0
alpha_step = (alpha_end - alpha_start)/spot_nslices
print alpha_step
spot = []

for a in range(spot_nslices):
        cyl = vizshape.addCylinder(height=spot_slice_height, radius=0.30, color=viz.YELLOW, top=None)       
        print a*alpha_step
        cyl.alpha( alpha_start + a*alpha_step )
        cyl.enable(viz.SAMPLE_ALPHA_TO_COVERAGE)
        cyl.disable(viz.BLEND)
        spot_yPos = spot_slice_height/2 + spot_elevation + a*spot_slice_height
        cyl.setPosition([0,spot_yPos,10])
        spot.append(cyl)

# rotate ground
def random_rotate(object_to_rotate, duration):

        rotate_val = random.randint(1, 360)

        spinto = vizact.spinTo(euler=(rotate_val, 0, 0), time=0, mode=viz.REL_GLOBAL)
        fadeout = vizact.fadeTo(0, time=duration)
        fadein = vizact.fadeTo(1, time=duration)

        rotate_action = vizact.sequence(fadeout, spinto, fadein)
        object_to_rotate.addAction(rotate_action)

vizact.onkeydown('r', random_rotate, world, 1)


import vizcam
cam = vizcam.PivotNavigate(center=[0,0,10],distance = 7)
cam.rotateUp(30)



All times are GMT -7. The time now is 04:30 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC