3D ASCII Block Building
C, 376 350 313 309 285 bytes
Thanks to @Jonathan Frech for saving four bytes!
#define F for(
char*t,G[26][67],*s;i,j,e,k,v,x,y;b(){F s="\\/__//\\__\\ ___ ";*s;--y,s+=5)F e=5;e--;*t=*s<33&*t>32?*t:s[e])t=G[y]+x+e;}f(int*M){F;e<1716;++e)G[e/66][e%66]=32;F k=0;++k<12;)F i=0;i<11;++i)F j=11;j--;v+k||b())x=i+j*3+k,y=14+i-k,(v=M[i*11+j])>=k&&b();F;++e<26;)puts(G+e);}
Try it online!
Unrolled:
#define F for(
char *t, G[26][67], *s;
i, j, e, k, v, x, y;
b()
{
F s="\\/__//\\__\\ ___ "; *s; --y, s+=5)
F e=5; e--; *t=*s<33&*t>32?*t:s[e])
t = G[y]+x+e;
}
f(int*M)
{
F; e<1716; ++e)
G[e/66][e%66] = 32;
F k=0; ++k<12;)
F i=0; i<11; ++i)
F j=11; j--; v+k||b())
x = i+j*3+k,
y = 14+i-k,
(v=M[i*11+j])>=k && b();
F; ++e<26;)
puts(G+e);
}
Charcoal, 70 69 68 bytes
≔E¹¹⮌I⪪S,θF²F¹¹F¹¹F¹¹«J⁻⁻⁺λκ×μ³ι⁻λκ≔§§θλμη¿∨⁼±η⊕κ‹κη¿ι“↗⊟&⁹κUhnI”___
Try it online! Link is to verbose version of code. Explanation:
≔E¹¹⮌I⪪S,θ
Read the array, split each line on commas and cast to integer, but also reverse each line, since we want to draw right-to-left so that left columns overwrite right columns. (Other dimensions already have desired overwriting behaviour.)
F²F¹¹F¹¹F¹¹«
Loop through i) top lines and bodies k) height l) rows m) columns. (Looping through first top lines and then bodies avoids overwriting bodies with top lines.)
J⁻⁻⁺λκ×μ³ι⁻λκ
Jump to the position of the cube.
≔§§θλμη
Fetch the height at the current row and column.
¿∨⁼±η⊕κ‹κη
Test whether a cube should be drawn at this height for this row and column.
¿ι“↗⊟&⁹κUhnI”___
Draw the body or top of the cube.
JavaScript (ES6), 277 251 bytes
a=>(n=55,$=f=>[...Array(n)].map((_,i)=>f(i)),S=$(_=>$(_=>' ')),n=11,$(l=>$(z=>$(y=>$(x=>(x=10-x,X=x*3+y+z,Y=y-z+n,Z=a[y][x])<=z&&Z+z+1?0:l?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),S.map(r=>r.join``).join`
`)
f=
a=>(n=55,$=f=>[...Array(n)].map((_,i)=>f(i)),S=$(_=>$(_=>' ')),n=11,$(l=>$(z=>$(y=>$(x=>(x=10-x,X=x*3+y+z,Y=y-z+n,Z=a[y][x])<=z&&Z+z+1?0:l?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),S.map(r=>r.join``).join`
`)
console.log(f([
[3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11],
[2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0],
[0, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0],
[0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 4, 3, 2, 1, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 11]
]))
Saved 26 bytes from @Neil's suggestion.
Ungolfed
a=>(
n=55,
$=f=>[...Array(n)].map((_,i)=>f(i)),
S=$(_=>$(_=>' ')),
n=11,
$(l=>
$(z=>$(y=>$(x=>(
x=10-x,
X=x*3+y+z,
Y=y-z+n,
Z=a[y][x],
Z<=z && Z+z+1 || (
l
? ['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s))
: S[Y].splice(X+1,3,...'___')
)
))))
),
S.map(r=>r.join``).join`\n`
)