tag:blogger.com,1999:blog-58437299448055094882024-03-14T04:02:50.017+01:00Finger TwitchesDimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.comBlogger50125tag:blogger.com,1999:blog-5843729944805509488.post-22526708253538875582015-04-23T02:31:00.002+02:002015-04-23T02:31:44.723+02:00Learning OpenGLSo I have finally decided to get down and dirty with learning OpenGL from the ground up, and what better way to do it then to write your own 3D viewer, which is exactly what I did.
To those who are observant, the viewer should look familiar as I am learning through the tutorials by <a href="http://learnopengl.com/">Joey de Vries</a>, however, I chose to implement it via QT instead of GLEW, as Joey does.
Additionally I have implemented my own camera, close to something I would be using in Maya, or any other 3D DCC app, so you tumble around a central pivot point. The math of the camera needs a bit of clean up as I am still getting some bugs, but it's usable, so will have to do for now.
To-come is an implementation of OBJ loading via <a href="https://github.com/syoyo/tinyobjloader">tinyobj</a> library, as well as Alembic support. I would like to eventually implement shader-based raytracing with Physically Based Rendering principles, and possibly implement the support for OpenSubDiv. But, as time is limited, this might take a while.
The current shading model is generic Phong.
<iframe src="https://player.vimeo.com/video/125002594" width="500" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
Enjoy!Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-68579585554473193222014-10-31T22:36:00.001+01:002014-10-31T22:36:50.525+01:00A basic dielectric with refractionAnother quick post. This is also not new, I've done this about a week ago, and its essentially an assembly of the theory posted by <a href="https://www.sfdm.scad.edu/faculty/mkesson/vsfx755/wip/best/spring2012/kevin_george/shaders/dielectric.html">Kevin George</a> that describes the Beer's Law of light absorbtion. He only posts some information about the main part of the shader (the logarithmic decay of the light), and so I went ahead and implemented the theory as well as the rest of the basic shader. This is not a physically plausible setup, and I am currently working on implementing a more generic, RSL 2.0 friendly, and physically plausible version that will eventually include some texture mapping support, and maybe other basic features. I am looking to implement a correct BRDF approach, and will see if I can actually utilize the GGX BRDF eventually. It is quite a bit of work, so I wouldn't expect this to be something that will come too soon, but still, its good to aim high!
<iframe src="//player.vimeo.com/video/109887872" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/109887872">test dielectric 01</a> from <a href="http://vimeo.com/dimitryk">Dimitry Kachkovski</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-57874187002829017282014-10-28T01:08:00.000+01:002014-10-28T01:08:07.824+01:00Henchmen TeaserI completely forgot to actually post the Henchmen Teaser, our lookdev piece, or a short, that basically sets the design and idea for our upcoming feature animated film with the same name - "Henchmen", which has gotten quite some publicity over the last few months (<a href="http://www.hollywoodreporter.com/behind-screen/siggraph-gary-sanchez-productions-produce-725064">http://www.hollywoodreporter.com/behind-screen/siggraph-gary-sanchez-productions-produce-725064</a>). If you haven't seen it yet, here is a chance to do so now! Enjoy!
<iframe src="//player.vimeo.com/video/103030689" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/103030689">HENCHMEN TEASER 2014</a> from <a href="http://vimeo.com/bronstudios">Bron Studios Inc.</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-39106619458007882812014-10-28T01:03:00.001+01:002014-10-28T01:03:26.949+01:00New logo for BRON Studios!Aaaaaaand its LIIIIVE! This is our new logo that many people will be seeing with most of the movies that BRON is going to be releasing and producing, and it features a whole bunch of stuff I did, such as the sim/lighting/rendering of the pouring lava, the sims of the steam, and the sims of the sparks. I have also done some finishing tweaks for comping. A huge props to <a href="https://www.linkedin.com/profile/view?id=28835328&authType=NAME_SEARCH&authToken=aPzk&locale=en_US&srchid=212383781414454179391&srchindex=1&srchtotal=2&trk=vsrp_people_res_name&trkInfo=VSRPsearchId%3A212383781414454179391%2CVSRPtargetId%3A28835328%2CVSRPcmpt%3Aprimary">Barry Andres</a> for doing an awesome job lighting and comping most of this shot, and to <a href="https://www.linkedin.com/profile/view?id=5655296&authType=NAME_SEARCH&authToken=hmZK&locale=en_US&trk=tyah2&trkInfo=tarId%3A1414454342572%2Ctas%3AMatth%2Cidx%3A1-6-6">Matthew Bilton</a> for doing a kick ass previs/layout job (the text reveal is his baby as was all the layout of the environment to make it happen!).
Enjoy!
<iframe src="//player.vimeo.com/video/108271862" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/108271862">BRON STUDIOS ANIMATED LOGO 2014</a> from <a href="http://vimeo.com/bronstudios">Bron Studios Inc.</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
P.S. If not showing here, just go to vimeo to check it out!Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-85221198164734825052014-10-20T09:45:00.000+02:002014-10-20T09:45:59.607+02:00A soap bubble shader - first RSL learning experienceSo as i start my process in moving towards LookDev and lighting departments, one of the necessary upgrades to my skill-set is learning shader development, specifically using renderman and RSL. So following a nice tutorial on digital tutors, this here is the result of my very first shader! Features included as i was going through the tutorial are raytraced fresnel reflections, thin-film light interference using distance and angular methods based on RGB spectrums (the rainbow effect on the soap bubble), and some noise based procedural displacements. Ah, and some gravity based thickness motion and general thickness variation (also noise based). As i learned all this, i will need to do a separate post on all the details i figured out so i can recap them, and hopefully remember a bit better.
<iframe src="//player.vimeo.com/video/109294323" width="500" height="390" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/109294323">bubble test</a> from <a href="http://vimeo.com/dimitryk">Dimitry Kachkovski</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com1tag:blogger.com,1999:blog-5843729944805509488.post-38287762408306127672014-04-17T06:35:00.001+02:002014-04-17T06:42:06.172+02:00Dry Ice - Some fun with maya fluidsWas having a bit of fun with Maya's Fluid dynamics. This is so much fun! (And yea, I know, everyone does Dry Ice... That still doesn't stop it from being very fun to do! :D)
<iframe src="//player.vimeo.com/video/92199066" width="500" height="390" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/92199066">fluid test</a> from <a href="http://vimeo.com/dimitryk">Dimitry Kachkovski</a> on <a href="https://vimeo.com">Vimeo</a>.</p>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-13790780137530421732014-04-12T01:50:00.001+02:002014-04-12T01:50:22.891+02:00Testing the UV exportTo add to my last post on Alembic, I wanted to also share how you can check if your values got exported. One of the easiest ways is to check this using Alembic's python bindings to traverse you ".abc" file. I'll post an example to show the way to do it using general Alembic python module, but there is also a slightly easier way to access the alembic files via Cask (a module provided with Alembic's examples that helps reading and modifying ".abc" files with python in a more straight forward way). You can find and download it here: <a href="http://code.google.com/p/alembic/source/browse/#hg%2Fpython%2Fexamples%2Fcask">http://code.google.com/p/alembic/source/browse/#hg%2Fpython%2Fexamples%2Fcask</a>.<br />
<br />
(NOTE - this example is for linux, but can be modified pretty easily for windows)<br />
So lets say you have a file called test_cache.abc located in "/home/userName/alembic_cache/". In the alembic file with have a simple sphere exported, named by default as <b>"pSphere1"</b>. The test will look like this:<br />
<pre class="python" name="code">import imath, alembic
archive = alembic.Abc.IArchive('/home/userName/alembic_cache/test_cache.abc')
top = archive.getTop()
mesh = alembic.AbcGeom.IPolyMesh(top.children[0], 'pSphereShape1')
# Should display <class 'alembic.AbcGeom.IPolyMesh'>
print type(mesh)
schema = mesh.getSchema()
# Should display <class 'alembic.AbcGeom.IPolyMeshSchema'>
print type(schema)
arb_params = schema.getArbGeomParams()
# This should show the extra UVs you exported, and, if you did export the
# Vertex colors, those too.
print arb_params.getNumProperties()
# Assuming you didn't export any colors, and only one extra map:
uv_header = arb_params.getPropertyHeader(0)
# Lets make sure that it is indeed the right property, so print the name.
# Should be the same as the UV map in our file (Note, the one that WASN'T the
# active one at the time of export!)
print uv_header.getName()
v2f_param = alembic.AbcGeom.IV2fGeomParam(arb_params, uv_header.getName())
# Lets make sure that what we got back is indeed what we want! Should be "True"
print alembic.AbcGeom.IV2fGeomParam.matches(uv_header)
# Now we get the uv sample that containes the values for the UVs and their
# indices.
uv_sample = v2f_param.getIndexedValue(0)
# Should get <class 'alembic.AbcGeom.IV2fGeomParamSample'>
print type(uv_sample)
uv_values = uv_sample.getVals()
uv_indices = uv_sample.getIndices()
# Lets make sure that what we got back is what it should be.
# Check the type of uv_values: should be <class 'imath.V2fArray'>
print type(uv_values)
# ...and indices: should be <class 'imath.UnsignedIntArray'>
print type(uv_indices)
# Now lets check the values: should get something like V2f(0.432955, 0.681514)
# Note, the values will obviously be different from mine here...
print uv_values[0]
# ...and indices: should just be some integer like 3
print uv_indices[0]</pre>
This should get you going and help you test what you exported and see if it worked.<br />
<br />
Hope that helps,<br />
<br />
Cheers,<br />
<br />
DKDimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-8714566774926443352014-04-12T00:06:00.001+02:002014-04-12T00:06:42.886+02:00Reaping the fruits of "Alembic" proportionsMany have heard about Alembic. It is now becoming the #1 used format for geometry data interchange in the VFX/Animation/Games communities. Created by the joined effort of Sony Imageworks and Industrial Light and Magic, all of us in the industry got a fantastic tool.<br />
<br />
In my recent endeavors I had to work on modifying Maya's Alembic Exporter to support multiple UV sets exporting. I will try to document my whole experience here so not to loose the info I learned, and also, perhaps, assist someone later in achieving the same thing easier, and perhaps better then I did.<br />
<br />
In essence, the actual theory behind the idea is not overly difficult, and Alembic supports such a possibility pretty straight forward. So, theoretically, I knew exactly what I was to do, or specifically:<br />
<br />
<ol>
<li>Parse if the object contains more then one UV set.</li>
<li>Get those UVs</li>
<li>Convert the data to a format that alembic can read and store.</li>
<li>Store it.</li>
<li>DONE!</li>
</ol>
<div>
Looking around the net for information, I stumbled onto a pretty large topic on the google alembic-discussion board:</div>
<div>
<a href="https://groups.google.com/forum/#!topic/alembic-discussion/UzXcQJkXJEI">https://groups.google.com/forum/#!topic/alembic-discussion/UzXcQJkXJEI</a></div>
<div>
From there I gathered some more detailed info on what needed to happen such as:</div>
<div>
<ul>
<li>UVs are stored as V2fGeomParam with a scope of varying or facevarying.</li>
<li>The original UVs, the default ones, are stored within the PolyMeshSchema of the mesh we are exporting through it's setUVs function, which is able to store only a single V2fGeomParamSample.</li>
<li>Any additional Params need to be stored within the arbGeomParams of the PolyMeshSchema.</li>
</ul>
</div>
<div>
The biggest challenge I was going to face, as I learned quite quickly, was dealing with Alembic API. For such a popular tool, I have to say, the documentation of it is superbly limited. Having gone through the official documentation on <a href="http://code.google.com/p/alembic/">http://code.google.com/p/alembic/</a>, I realized that it was pretty much all the information they had... The rest had to be derived almost entirely from their example code (that had nearly no doc strings) and the actual header files (yea, I built the Doxygen, which, without docstrings, is also not the most useful tool...) .</div>
<div>
<br /></div>
<div>
Having been coding Python almost exclusively, digging in head-first into such a project was a bit of a shock... One really starts to look at code documentation with greater respect... So for the first 2 days I felt very much like this:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/dOlSMIQ.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/dOlSMIQ.gif" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Well, I am glad to say that I did finally finish the implementation, and I will share it here. So if anyone is interested in adding the code to their own exporter, they will be able to export multiple UVs themselves. I still need to write the modifications to the AbcImporter for Maya so that the multi UVs will be read and added to the imported meshes, but for the time being this works for things like Maya->Katana pipelines.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So the main change I did was to modify the creator function of the MayaMeshWriter. There are two parts in that creator function that run for a SubD mesh export and a PolyMesh export. I will post the poly mesh one, and will specify what needs to be changed for the SubD stuff.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So you should replace this:</div>
<pre class="cpp" name="code">...
Alembic::AbcGeom::OPolyMesh obj(iParent, name.asChar(), iTimeIndex);
mPolySchema = obj.getSchema();
Alembic::AbcGeom::OV2fGeomParam::Sample uvSamp;
if ( mWriteUVs )
{
getUVs(uvs, indices);
if (!uvs.empty())
{
uvSamp.setScope( Alembic::AbcGeom::kFacevaryingScope );
uvSamp.setVals(Alembic::AbcGeom::V2fArraySample(
(const Imath::V2f *) &uvs.front(), uvs.size() / 2));
if (!indices.empty())
{
uvSamp.setIndices(Alembic::Abc::UInt32ArraySample(
&indices.front(), indices.size()));
}
}
}
Alembic::Abc::OCompoundProperty cp;
Alembic::Abc::OCompoundProperty up;
if (AttributesWriter::hasAnyAttr(lMesh, iArgs))
{
cp = mPolySchema.getArbGeomParams();
up = mPolySchema.getUserProperties();
}
// set the rest of the props and write to the writer node
mAttrs = AttributesWriterPtr(new AttributesWriter(cp, up, obj, lMesh,
iTimeIndex, iArgs));
writePoly(uvSamp);
...</pre>
<div>
With this:</div>
<pre class="cpp" name="code">...
Alembic::AbcGeom::OPolyMesh obj(iParent, name.asChar(), iTimeIndex);
mPolySchema = obj.getSchema();
std::vector<Alembic::AbcGeom::OV2fGeomParam::Sample> uvSamps;
Alembic::AbcGeom::OV2fGeomParam::Sample defaultUV;
std::vector<float> uvs;
std::vector<Alembic::Util::uint32_t> indices;
MStringArray uvSetNames;
lMesh.getUVSetNames(uvSetNames);
if ( mWriteUVs )
{
MGlobal::displayInfo("Writing the default UVs");
getUVs(uvs, indices);
if (!uvs.empty())
{
defaultUV.setScope( Alembic::AbcGeom::kFacevaryingScope );
defaultUV.setVals(Alembic::AbcGeom::V2fArraySample(
(const Imath::V2f *) &uvs.front(), uvs.size() / 2));
if (!indices.empty())
{
defaultUV.setIndices(Alembic::Abc::UInt32ArraySample(
&indices.front(), indices.size()));
}
}
}
Alembic::Abc::OCompoundProperty cp;
Alembic::Abc::OCompoundProperty up;
if (AttributesWriter::hasAnyAttr(lMesh, iArgs))
{
cp = mPolySchema.getArbGeomParams();
up = mPolySchema.getUserProperties();
}
// set the rest of the props and write to the writer node
mAttrs = AttributesWriterPtr(new AttributesWriter(cp, up, obj, lMesh,
iTimeIndex, iArgs));
writePoly(defaultUV);
//Write multiple UVs if present
if (uvSetNames.length() > 1)
{
MGlobal::displayInfo("Will be exporting multiple UVs now!");
Alembic::Abc::OCompoundProperty arbParams;
arbParams = mPolySchema.getArbGeomParams();
MString lastUVSetName = lMesh.currentUVSetName();
for (int i = 0; i < uvSetNames.length(); i++)
{
MString uvSetName = uvSetNames[i];
if (uvSetName == lastUVSetName)
{
continue;
}
std::string uvSetPropName = uvSetName.asChar();
Alembic::AbcCoreAbstract::MetaData md;
Alembic::AbcGeom::OV2fGeomParam uvProp(arbParams, uvSetPropName, true,
Alembic::AbcGeom::kFacevaryingScope, 1, iTimeIndex, md);
mUVParams.push_back(uvProp);
}
std::vector <Alembic::AbcGeom::OV2fGeomParam>::iterator uvIt;
std::vector <Alembic::AbcGeom::OV2fGeomParam>::iterator uvItEnd;
uvIt = mUVParams.begin();
uvItEnd = mUVParams.end();
for(; uvIt != uvItEnd; ++uvIt)
{
MString uvSetName(uvIt->getName().c_str());
lMesh.setCurrentUVSetName(uvSetName);
Alembic::AbcGeom::OV2fGeomParam::Sample uvSamp;
getUVs(uvs, indices);
if (!uvs.empty())
{
uvSamp.setScope( Alembic::AbcGeom::kFacevaryingScope );
uvSamp.setVals(Alembic::AbcGeom::V2fArraySample(
(const Imath::V2f *) &uvs.front(), uvs.size() / 2));
if (!indices.empty())
{
Alembic::Abc::UInt32ArraySample vals(&indices.front(), indices.size());
uvSamp.setIndices(vals);
}
}
uvIt->set(uvSamp);
uvSamps.push_back(uvSamp);
}
lMesh.setCurrentUVSetName(lastUVSetName);
}
...
</pre>
I am not sure how optimized that is, but it works. I more then welcome comments on how to improve this, btw!
Now a few things to add. You need to include a definition of the mUVParams to the MayaMeshWriter.h file:
<br />
<pre class="cpp" name="code">...
std::vector&ltAlembic::AbcGeom::OV2fGeomParam&gt mUVParams;
...
</pre>
<div>
Now, I made a mistake here, which I learned is a big one. When you define the entry in the header, you will need to recompile most of the plugin to make sure your symbol table matches (I still need to read up more on that to know exactly what the meaning is, unfortunately, but as far as I understand, the mapping of the variables to the memory addresses gets messed up if you don't do the re-compile...). When I forgot to do that as I was testing the implementations, I got very weird memory crashes, until it hit me that perhaps my headers information wasn't being updated with the rest of the plugin.<br />
<br />
And finally, the only thing needed to change for that code to suit it for the SubDiv part of MayaMeshWriter::MayaMeshWriter, is to replace all of the <b>mPolySchema </b>variables with <b>mSubDSchema</b>. Note the way OSubD stuff is defined in the code originally, and try to maintain that so that you don't screw up the schema writing process.<br />
<br />
Hope that helps!<br />
<br />
Cheers,<br />
<br />
DK</div>
Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com2tag:blogger.com,1999:blog-5843729944805509488.post-68168450596940520622014-02-25T20:56:00.001+01:002014-02-25T20:56:35.378+01:00SIGGRAPH University - "The Digital Production Pipeline"<div class="separator" style="clear: both; text-align: left;">
An excellent talk on pipelines across VFX from Sigrgaph 2013.</div>
<div class="separator" style="clear: both; text-align: center;">
<object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/MA_tpeyas4o/0.jpg"><param name="movie" value="https://youtube.googleapis.com/v/MA_tpeyas4o&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/MA_tpeyas4o&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-85373087957314363572014-02-25T00:07:00.001+01:002014-02-27T23:47:46.521+01:00Debugging Models and Views using ModelTestIf you are like me, and spend quite a bit of time making new tools that always seems to require more and more advanced ways of working with QModels and QViews, you might have ran into issues with Segmentation Faults and general problems where it is very hard to tell where an how you've gone wrong.<br />
QT has a very neat little module in it's C++ library called <a href="http://qt-project.org/wiki/Model_Test">ModelTest</a>. This is basically a little virtual tester that keeps a watch on your model's activity, and as certain aspects of the model or it's data change, it analyzes the changes, and tests if all the changes go through the expected cycle.<br />
If you are not using QT, but are rather on the side of using PySide or PyQt, there is a <a href="https://code.google.com/p/modeltest-pyside/">Python Version of ModelTest</a>. It saved me a ton of time just recently where I had some very hard-to-track issues that would pop up without recognizable patterns.<br />
Using ModelTest is super simple:
<br />
<pre class="python" name="code">...
from ModelTest import ModelTest
model = MyModel()
parent.setModel(model)
ModelTest(model, self) # Second argument simply needs to be a parent to attach ModelTest to.
...
</pre>
<br />
Happy Coding!Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-31653041353732178612014-02-21T00:08:00.003+01:002014-02-21T00:09:42.874+01:00Getting mouse position within QAbstractItemViewSpent a few hours trying to make a presenter for a context menu that I am making within my UI. What I wanted to do was to allow for the context menu to be dynamic to what it appears above, regardless of what is currently selected. The problem I faced was that I needed to get the position of the mouse, and then map that global position to the view that I am using, and get the index of the model that is at the position I am looking at.<br />
<br />
In order, here is how I proceeded.<br />
<br />
When I create the context menu for a view, there is signal triggered, that emits a <b>QPoint</b> of where the mouse has been clicked:<br />
<pre class="python" name="code">...
# Connect the signal and the slot
self.view_context_menu = QtGui.QMenu()
self.view.customContextMenuRequested.connect(self.show_view_context_menu)
# The function to show the menu
def show_view_context_menu(self, pos):
# We need to take the point we got from the signal, and map it to the world
mapped_point = self.view.viewport().mapToGlobal(pos)
# Now show the menu in the global space
self.view_context_menu.exec_(mapped_point)
</pre>
All seems well and simple, we got our menu, and we displayed it. But now, I want to get the index that might be at that point, and change the context menu accordingly. Lets say for now, I just want to see if the index is a valid one or not.
<br />
<pre class="python" name="code">...
# Connect this to run right before the menu appears
self.view_context_menu.aboutToShow.connect(self.set_menu_action_states)
...
def set_menu_action_states(self):
point = QtGui.QCursor.pos()
index = self.get_item_at_point(point)
print index.isValid()
def get_item_at_point(self, point):
return self.view.indexAt(point)
</pre>
Seems straightforward. However, what happens here, the point we get with <b>QtGui.QCursor.pos()</b> is in the world space of our monitor(s). So, whenever you will be trying to run this code, you will pretty much never get a valid index, because, as far as the view is concerned, you are not within it.
So to solve this issue one has to transform the cursor position back into the view's coordinate system. But, you have to also remember something - all views in QT inherit the <b>QAbstractItemView</b> class, which in turn inherits the <b>QAbstractScrollArea</b>. What this means, is, the coordinate system of the actual view widget is a bit different then what we get when we are displaying the menu with <b>customContextMenuRequested</b>. The scroll area creates little widgets to drive the area display if some items in your view are hidden, allowing, well, for scrolling. Additionally, there are headers that the view posses, and those are different from what we see within the rest of the view. To be exact, everything we see withing the view, such as the view's items, are all sitting within the view's <b>viewport </b>coordinate system. If one has paid attention when we were showing the menu, we use the <b>self.view.viewport().mapToGlobal()</b> function to determine where the menu should appear. We have to do the same, but in reverse, when we are trying to find the indices under our mouse. So the corrected function looks like this:<br />
<pre class="python" name="code">
def get_item_at_point(self, point):
mapped_point = self.view.viewport().mapFromGlobal(point)
return self.view.indexAt(mapped_point)
</pre>
And that's it!Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-58028060113731187162014-02-18T01:03:00.002+01:002014-02-18T01:03:22.773+01:00Alembic Maya - Edge Crease ExportRecently I encountered a request from our Rigging TD to see how we may be able to export meshes in Alembic format with edge crease information from Maya. Unfortunately, Alembic is still quite poorly documented in one single place, so it takes a bit of time to put all the information together to figure out how certain things are done. One of the things I ended up having to do was to actually traverse the AlembicExporter for Maya to learn how certain export processes work. The main Object that we need to look at to see how Alembic finds crease data is <a href="http://docs.autodesk.com/MAYAUL/2014/ENU/Maya-API-Documentation/cpp_ref/_abc_export_2_maya_mesh_writer_8cpp-example.html">MayaMeshWrite.cpp</a>. In this Object, if we look at lines 288-324, the constructor of the MayaMeshWriter object, we can see this chunk of code:
<br />
<pre class="cpp" name="code">// check to see if this poly has been tagged as a SubD
MPlug plug = lMesh.findPlug("SubDivisionMesh");
if ( !plug.isNull() && plug.asBool() )
{
Alembic::AbcGeom::OSubD obj(iParent, name.asChar(), iTimeIndex);
mSubDSchema = obj.getSchema();
Alembic::AbcGeom::OV2fGeomParam::Sample uvSamp;
if ( mWriteUVs )
{
getUVs(uvs, indices);
if (!uvs.empty())
{
uvSamp.setScope( Alembic::AbcGeom::kFacevaryingScope );
uvSamp.setVals(Alembic::AbcGeom::V2fArraySample(
(const Imath::V2f *) &uvs.front(), uvs.size() / 2));
if (!indices.empty())
{
uvSamp.setIndices(Alembic::Abc::UInt32ArraySample(
&indices.front(), indices.size()));
}
}
}
Alembic::Abc::OCompoundProperty cp;
Alembic::Abc::OCompoundProperty up;
if (AttributesWriter::hasAnyAttr(lMesh, iArgs))
{
cp = mSubDSchema.getArbGeomParams();
up = mSubDSchema.getUserProperties();
}
mAttrs = AttributesWriterPtr(new AttributesWriter(cp, up, obj,
lMesh, iTimeIndex, iArgs));
writeSubD(uvSamp);
}
</pre>
In the code, you may notice that the exporter is looking for the plug "SubDivisionMesh" in the mesh that is being parsed. Now, when I looked at this the first time, I thought that the tag might be added when you use an actual SubD meshes created in Maya. But, alas, in Maya 2014, the support for the SubD meshes has been changed, and you no longer can even create Subdivision primitives...<br />
<br />
After a few attempts I realized that the SubD meshes that I got converted from PolyMeshes were not containing the "SubDivisonMesh" plug that the exporter was looking for.<br />
<br />
Over the weekend the Rigging TD that asked me to look into this, had a look as well, and saw what I was missing this whole time - the flag "SubDivisionMesh" was a <b>bool</b> tag that the user was supposed to add him/herself! And sure enough, as soon as you add the tag to the mesh (NOTE: Add the tag to the Shape node of the mesh, NOT the transform node. But export the Transform node. Makes sense, right??? If so, lucky you, cause I don't get the point...:( ) and export it, the mesh is exported using Alembic's <b>OSubD </b>and <b>OSubDSchema</b>, which is capable of storing the edge creases and corners, as <a href="https://code.google.com/p/alembic/wiki/Alembic_Geometric_Types">per Alembic docs</a>. The creases are exported in <b>MayaMeshWriter::writeSubD</b> function, in lines 834-862:
<br />
<pre class="c++" name="code">std::vector <Alembic::Util::int32_t> creaseIndices;
std::vector <Alembic::Util::int32_t> creaseLengths;
std::vector <float> creaseSharpness;
std::vector <Alembic::Util::int32_t> cornerIndices;
std::vector <float> cornerSharpness;
MUintArray edgeIds;
MDoubleArray creaseData;
if (lMesh.getCreaseEdges(edgeIds, creaseData) == MS::kSuccess)
{
unsigned int numCreases = creaseData.length();
creaseIndices.resize(numCreases * 2);
creaseLengths.resize(numCreases, 2);
creaseSharpness.resize(numCreases);
for (unsigned int i = 0; i < numCreases; ++i)
{
int verts[2];
lMesh.getEdgeVertices(edgeIds[i], verts);
creaseIndices[2 * i] = verts[0];
creaseIndices[2 * i + 1] = verts[1];
creaseSharpness[i] = static_cast<float>(creaseData[i]);
}
samp.setCreaseIndices(Alembic::Abc::Int32ArraySample(creaseIndices));
samp.setCreaseLengths(Alembic::Abc::Int32ArraySample(creaseLengths));
samp.setCreaseSharpnesses(
Alembic::Abc::FloatArraySample(creaseSharpness));
}
</pre>
Another thing to note: the "SubDivisionMesh" plug does not need to be added to the export Attributes list in the Alembic Exporter or the script function <b>AbcExport</b>. The plug is searched for in the <b>MayaMeshWriter </b>constructor, and so any mesh object being exported will be checked for the presence of this flag.
<br />
<br />
Hopefully this saves someone out there the time it took me and my colleague to look all this up!
<br />
<br />
I'll keep writing more as I dig deeper into Alembic, and Alembics exporter for maya, so perhaps this blog will live again! Yay!
Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com5tag:blogger.com,1999:blog-5843729944805509488.post-43686717706790375102013-02-20T21:30:00.000+01:002014-02-17T20:15:35.816+01:00Storing attribute values with Maya APIThis problem occurred as I was working on a tool that created attributes via maya api, and I had to set certain values on those attribs, and as I did so, I would save the file, and then re-open it, to find that the values I set were not being saved.
Here is my original code:
<pre name="code" class="python">
import maya.OpenMaya as om
import maya.OpenMayaAnim as oma
depFn = om.MFnDependencyNode()
setObj = depFn.create("objectSet", "SaveLoadAnim")
uAttr = om.MFnUnitAttribute()
startAttr = uAttr.create("Start", "s", om.MFnUnitAttribute.kTime, oma.MAnimControl.minTime().value())
uAttr.setStorable(True)
uAttr.setKeyable(False)
endAttr = uAttr.create("End", "e", om.MFnUnitAttribute.kTime, oma.MAnimControl.maxTime().value())
uAttr.setStorable(True)
uAttr.setKeyable(False)
dgModifier = om.MDGModifier()
dgModifier.addAttribute(setObj, startAttr)
dgModifier.addAttribute(setObj, endAttr)
dgModifier.doIt()
</pre>
<br />
If you run this code in maya, you'll notice that a set is created, and in the "Extra Attributes" there are 2 MTime attributes for "Start" and "End". They should be set as the current values of your scene's start/end.
Now save this file somewhere, and re-open it. You'll notice that the values are now both set to 0... This quite confused me as I set the default value on the attributes creation as well as set the "storable" value to True...
<br />
<br />
After some digging around and talking to people about the issue, a colleague suggested that it might be the actual DG evaluation that might be causing the problem in setting this value to be stored with the attribute. His theory led me to think that it might be the case that DGModifier isn't flagging the default value as an actual value to be stored to the memory of the attribute as the DG isn't marked dirty on the attributes creation. And if it's not marked "dirty", the actual process of setting the attrib value inside the attribute itself just doesn't occur.
<br />
<br />
To test this idea I changed my code around a little, and - voilĂ ! - it worked. So here is my final code:
<pre name="code" class="python">
import maya.OpenMaya as om
import maya.OpenMayaAnim as oma
depFn = om.MFnDependencyNode()
setObj = depFn.create("objectSet", "SaveLoadAnim")
uAttr = om.MFnUnitAttribute()
startAttr = uAttr.create("Start", "s", om.MFnUnitAttribute.kTime)
uAttr.setStorable(True)
uAttr.setKeyable(False)
endAttr = uAttr.create("End", "e", om.MFnUnitAttribute.kTime)
uAttr.setStorable(True)
uAttr.setKeyable(False)
dgModifier = om.MDGModifier()
dgModifier.addAttribute(setObj, startAttr)
dgModifier.addAttribute(setObj, endAttr)
dgModifier.doIt()
startPlug = depFn.findPlug(startAttr)
endPlug = depFn.findPlug(endAttr)
startPlug.setMTime(oma.MAnimControl.minTime())
endPlug.setMTime(oma.MAnimControl.maxTime())
</pre>
<br />
Cheers,
<br />
<br />
DKDimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-2472653978099610072012-12-07T21:10:00.002+01:002014-02-17T20:16:49.414+01:00Alternative to maya.standaloneRecently I had a challenge to write a tool that would export scene information of a maya file. I had the tool working for a while, however it needed to have maya GUI open so as to be able to load the files that it needed to export. The problem I faced this time around was the need for the exporter to work in the background as it needed to open a different file to the one currently being used.
From the get-go I wanted to avoid using mayabatch as I didn't want to go the MEL path. After some research, the alternative that I found was maya.standalone module.
All seemed fine and dandy, but after some time testing this module, I found that there was a major drawback to maya's standalone module. The very problem is that as soon as you try to load any file that utilizes Mental Ray, or just loads the Mayatomr.mll plugin, the remote maya crashes. There are alternatives to bypass that, but it basically means making sure that the file you are loading in no way requests for that plugin. If you are using ".ma" files, one way is to make sure that there is no requirement request for the Mayatomr.mll. Just search the file in a text editor (of course only works if you are using a maya ASCII '.ma' format), and delete the line if it is there. However, keep in mind that if you do have something in the scene that requires that plugin, you will get errors, and many things might become unstable and rather unpredictable.
In my case, I could not bypass the MR issue. We are using MentalRay, and there is no way for me to go through nearly a 100 assets and adjust every one of them.
Being desperate I started googling everywhere for a possible alternative. I did notice that some people mentioned the use of pymel for their batching, but unfortunately noone ever clarified what they meant, and how exactly they utilized pymel. I used python's subprocess module to call for a python script to be run by mayapy. Here is what the call looks like:
<pre name="code" class="python">import subprocess
import dataExporter #this is the script I want to run remotely
import sys
import os.path
paths = sys.path
rootPath = None
for path in paths:
if os.path.exists(path + "\\Maya.exe"):
rootPath = path + "\\mayapy.exe"
break
scriptPath = dataExporter.__file__
myVar = "Hello World"
command = '{0} {1} {2}'.format(rootPath, scriptPath, myVar)
mayaVar = subprocess.Popen(command, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
subprocess.Popen.wait(mayaVar)
a, b = mayaVar.communicate()
if mayaVar.returncode:
print b
else:
print a
</pre>
<br />
First of all, I need to give credit to Henry Foster for a wonderful post that allowed me to clarify the use of subprocess and how to get the data from it. <a href="http://www.toadstorm.com/blog/?p=136">Here is his original post</a>.
<br />
Now I'll take a bit to clarify what I am doing in the code. The first part:
<pre name="code" class="python">
paths = sys.path
rootPath = None
for path in paths:
if os.path.exists(path + "\\Maya.exe"):
rootPath = path + "\\mayapy.exe"
break</pre>
This piece of code simply figures out where your location for mayapy.exe is. Pretty straight forward.
Now for some fun stuff:
<pre name="code" class="python">
scriptPath = dataExporter.__file__
myVar = "Hello World"
command = '{0} {1} "{2}"'.format(rootPath, scriptPath, myVar)
mayaVar = subprocess.Popen(command, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
subprocess.Popen.wait(mayaVar)
output, errors = mayaVar.communicate()
if not mayaVar.returncode:
print output
else:
print errors</pre>
Here I am looking for the full path to the script I am going to run in the subprocess, and then initialize the subprocess itself.
The "mayaVar" variable holds for us the output that that happens inside the subprocess. As you can see from the code, I am passing to the subprocess first the location of mayapy.exe, then the location of the script I want mayapy to run, and then I pass it the single variable that the script is going to accept. I also open up the PIPE from the subprocess to send and receive values between our mayapy.
Then comes a rather important part of the script where I request the subprocess to wait for itself to finish the job. Now that part isnt' always necessary. However, my tool needed for the exported data to be available to continue, so I couldn't allow maya to just go on. If the wait method is not envoked, your subprocess will run just fine, but the output values from the mayaVar will not be available right away. In some cases, i.e. batch exporting, you probably don't even want to wait as you might be doing some other logic after the batch has been sent off. Keep in mind that invoking wait() will cause maya to stall and wait for the output from your subprocess and hence will not allow any user interaction during that time.
Once my data is exported I check whether the process was a success at all, and if any errors were thrown. That is done via subprocess' "returncode": 1 - True, some errors have occured, 0 - False, nothing went wrong, all is good (I found this quite unintuitive at start, but got used to it). Now once your process is done, you can assign the subprocess outputs to some variables.
And finally here is the actual variation of the 'dataExporter' file that can give you some sort of output:
<pre name="code" class="python">
import sys
import pymel.core as pm
def replyToMessage(message):
reply = ""
if message == "Hello World":
reply = "Hello to you too!"
elif message == "Goodbye":
reply = "Leaving already? Ah well, take care!"
else:
reply = "I am sorry, not sure what you just said..."
sys.stdout.write(reply)
return reply
if __name__ == "__main__":
replyToMessage(sys.argv[1])</pre>
By just importing the pymel.core you initialize a specialized maya.standalone. The 'sys.stdout.write' will write you the output that you will get back. Keep in mind, all of the feedback you get will be in string format. I do not think there is any way to pass more complex data between this script being run and the current maya session you are running as a user without any socket connection.
Anyway, hope someone finds this helpful at some point!
Till next time,
DKDimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com3tag:blogger.com,1999:blog-5843729944805509488.post-67829394885539979092012-07-02T05:11:00.003+02:002014-02-17T20:18:30.246+01:00Some "Mind Glitches" about MFnSkinCluster and MPlug...It's been a while since anything appeared here, but that is due mainly because in the last half a year I have quite seriously moved more and more towards the technical side of life in 3D, and so there weren't so many updates to show for drawing...<br />
<br />
However, I now intend to write a little on what I am finding now that I am being more involved in the tools and plugin dev at my new job at <a href="http://www.bronstudios.com/">Bron Studios</a>.<br />
<br />
I have lately been digging more and more into different areas of Maya's API, and there are certain things I am sure I am bound to forget and will need again some day (or perhaps someone else will be looking for the explanations, and maybe these will shed light on what might be going on).<br />
<br />
My current endeavor is into creating a nice and solid vertex based skin saving/loading and transfer. As I was looking for different approaches to get the skin data out of a skinCluster, I obviously started down the path of using the MFnSkinCluster. However, I quickly discovered that the information that I get there is rather cumbersome as I need to actually do a full mesh component iteration on an objects vertices to get the weighting data. That is hardly a fast process, and so I tried looking for other possible solutions. I knew that there is ways of getting the data from the skinCluster via the regular Maya Python interface through the skinCluster attributes "weightList" and it's "weights" attributes. The way this attribute stores data is in a compound attribute which is basically a nested list. For each vertex index in the mesh there is a "weightList" entry associated with that index that stores the weights for that vertex. It can be accessed with something like this:<br />
<span style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"></span><br />
<pre name="code" class="python">import maya.cmds as m
obj = 'skinCluster2'
items = m.getAttr (obj + '.weightList', mi = True)
for i in items:
print i
print m.getAttr (obj + '.weightList[%s].weights'%i)</pre>
<br />
This will return to you the index of the vert being parsed, as well as a list containing it's weights. However, the problem I encountered here is that to figure out which verts contain which influence objects, you need to do a fair amount of sorting: you will need to loop through the influences, get the verts that each influence affects, then sort them to group each verts' influences to form a coherent table. To me, this is as cumbersome as the MFnSkinCluster, and is also slower, as we aren't parsing through the API.<br />
<br />
As I looked around, I sumbled on a wonderful page by Tyler Thornock that utilizes both the API and the attribute parsing to get the skin weights. But as I was going through his method, I started figuring out what each line did, why, and how (as I always tend to). You can find his code <a href="http://www.charactersetup.com/tutorial_skinWeights.html">HERE</a>. The following line is what got me thinking:<br />
<pre name="code" class="python">wPlug.selectAncestorLogicalIndex(vId, wlAttr)
</pre>
I couldn't figure out what this "selectAncestorLogicalIndex" was for. But after digging around I found that this basically set a compound attribute to display a specific part of it's data. In other words, when Tyler was getting plug data from the "weightList" of the skinCluster, and then the "weights" (the wPlug), he needed to set the weights plug to display information for a specific weightList index. Since the wPlug contained all of the info for all of the weightLists, you can't just go through it as any other list. And so the "selectAncestoralLogicalIndex" is used to specify which part of the wPlug to parse.<br />
<br />
To show it a little more practically, when MPlugs for the attributes were created:<br />
<br />
<pre name="code" class="python">
wlPlug = skinFn.findPlug('weightList')
wPlug = skinFn.findPlug('weights')
</pre>
<br />
<br />
...if you would try to check the amount of elements in wPlug with "wPlug.numElements()" Maya would actually crash. However, as soon as you set the LogicalIndex to be one of the verts, and tried to get that again you'd get a result of the amount of influences that vertex is affected by:<br />
<br />
<pre name="code" class="python">
wlPlug = skinFn.findPlug('weightList')
wPlug = skinFn.findPlug('weights')
wlAttr = wlPlug.attribute()
wPlug.selectAncestorLogicalIndex(0, wlAttr)
print wPlug.numElements()
</pre>
<br />
<br />
This is it for now, I am going to dig a little further, but hopefully after writing this, I will not forget how it works!Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-11197190908995682902011-11-27T04:21:00.002+01:002011-11-27T07:12:22.475+01:00New BlogFor anyone interested, i also started a new Tumblr blog that i will use primarily for inspirational stuff, posting things that grabbed my attention. So far i am finding Tumblr super user friendly, but as i have quite a bit already here, i do not want to ditch blogspot just yet...<br />
Anyway, check it out:<br />
<a href="http://derangedartisan.tumblr.com/">http://derangedartisan.tumblr.com</a>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-65802952032185390032011-11-27T03:31:00.003+01:002011-11-27T03:50:01.691+01:00Back in business!<div class="separator" style="clear: both; text-align: left;">Well, it's been a while, but I am back to drawing again. Here are some sketches i did after going to CTNX, which was an absolute blast. I think I have inspiration to spare for months! Gotta work hard now, and get the animations done!</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlyPkVL-XU9C_ZTOVzDI_1Dl-82tDVW21ER4_TqbwwPQnNDfCTFfhAqKPEeK94Fw8Na8Z5rPP7t_D7XAk-U_XDGekE-8gxu_35BWv8sjC8NZ5_isqzMVIVS6ubTlobwwcfC7-RzuYYfNrU/s1600/StephenWiltshire.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlyPkVL-XU9C_ZTOVzDI_1Dl-82tDVW21ER4_TqbwwPQnNDfCTFfhAqKPEeK94Fw8Na8Z5rPP7t_D7XAk-U_XDGekE-8gxu_35BWv8sjC8NZ5_isqzMVIVS6ubTlobwwcfC7-RzuYYfNrU/s320/StephenWiltshire.jpg" width="240" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBZmeKhXij7-j8fPfmkYJDWBLlVehe_SbMR1_PluDnZ6tNBAnYPkPpkhae98Dh_X_UWKMuzr-CnFQWXy1W2XFY6CEUYP44V9-0cqSzbAyh-EQz5q0N43Ixia7yvZ1kGjlLZUc1pWaz9ip3/s1600/airportSketching01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBZmeKhXij7-j8fPfmkYJDWBLlVehe_SbMR1_PluDnZ6tNBAnYPkPpkhae98Dh_X_UWKMuzr-CnFQWXy1W2XFY6CEUYP44V9-0cqSzbAyh-EQz5q0N43Ixia7yvZ1kGjlLZUc1pWaz9ip3/s320/airportSketching01.jpg" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0ZM9eq92ulT-M42Z9JK4MtiFFJB7FvEJSGIZhjZ8CH_INRmVKgRtu-P4MBX3EPQRU7iHxF94AgwNuM6aCligaEM_1pmVjGhRrlZAREe3C9nnhMhTfRGHBp5TGCnYMGgXifK7W387hQEPv/s1600/blenzSketching01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0ZM9eq92ulT-M42Z9JK4MtiFFJB7FvEJSGIZhjZ8CH_INRmVKgRtu-P4MBX3EPQRU7iHxF94AgwNuM6aCligaEM_1pmVjGhRrlZAREe3C9nnhMhTfRGHBp5TGCnYMGgXifK7W387hQEPv/s320/blenzSketching01.jpg" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyznjlaTs78y2TFwdTIPoW568G-_bbiI5EP2wxd-_d4ydeGFhKs0H_9m41h-2_0xzFNK-H6A30-KcnC5lVR3Z_hRsuKI6eV6IF3V3Y6JpSvCrasFXd-tEEKj23pcfsm3KBZ5acbWSpNKLw/s1600/blenzSketching02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyznjlaTs78y2TFwdTIPoW568G-_bbiI5EP2wxd-_d4ydeGFhKs0H_9m41h-2_0xzFNK-H6A30-KcnC5lVR3Z_hRsuKI6eV6IF3V3Y6JpSvCrasFXd-tEEKj23pcfsm3KBZ5acbWSpNKLw/s320/blenzSketching02.jpg" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRSPSm9n0rmP6q-BVaK9QyL2FRxvQdFaYqu7GsvkCjc-mbEadKyZkhKCz_UE6F6RQjFixhJlP37XtqCQVeEZiBcd1c5HjrZ7tdJfloiRjSaMt8FFQ30MLlaZ9mAXbks4xG9bf-mGAEimbK/s1600/CTN_HeadFromImagination01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRSPSm9n0rmP6q-BVaK9QyL2FRxvQdFaYqu7GsvkCjc-mbEadKyZkhKCz_UE6F6RQjFixhJlP37XtqCQVeEZiBcd1c5HjrZ7tdJfloiRjSaMt8FFQ30MLlaZ9mAXbks4xG9bf-mGAEimbK/s320/CTN_HeadFromImagination01.jpg" width="195" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicqo_xTp0r2lIy0QKNEcy7Ynb7dBy2CnNKbxE6Dij4Xea_juQ1gDdmHDTb1bOo3BgieCrHF4QBVFlmXmwA01ISqzbMp01w1MQQ6w-xiRw0xijADrufwaBvyo0ybdJFflkS0rKP_MYNEmXI/s1600/CTN_LifeDrawing01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicqo_xTp0r2lIy0QKNEcy7Ynb7dBy2CnNKbxE6Dij4Xea_juQ1gDdmHDTb1bOo3BgieCrHF4QBVFlmXmwA01ISqzbMp01w1MQQ6w-xiRw0xijADrufwaBvyo0ybdJFflkS0rKP_MYNEmXI/s320/CTN_LifeDrawing01.jpg" width="166" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghfKv0iKu7-wmISkvNqidZa4FQrHH0r2fB5plJpNV44hLcSNFvinAodGgkEsyBRucgKAZJ5TD-jwTPxAMSo43RCI7AazHGjv6mLV4qqWSiNQhPHOXy5CUyevUR-msOf8urm0hgSG3ZrMpm/s1600/GuyAtAStreetlight01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghfKv0iKu7-wmISkvNqidZa4FQrHH0r2fB5plJpNV44hLcSNFvinAodGgkEsyBRucgKAZJ5TD-jwTPxAMSo43RCI7AazHGjv6mLV4qqWSiNQhPHOXy5CUyevUR-msOf8urm0hgSG3ZrMpm/s320/GuyAtAStreetlight01.jpg" width="314" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUGffi60FJ-UjH987eVxcqQYNG3oR0ozFKD8pevyd8sIRR_X_NiSmiZtCOYQzYByHiC_G3s8tSRuH2JzOer5WKyVTucg5A7othBdabzVs6KHNN_89ivVUe_nbEQDfGCk_tksCTj6gXIF_Y/s1600/Hoodie.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUGffi60FJ-UjH987eVxcqQYNG3oR0ozFKD8pevyd8sIRR_X_NiSmiZtCOYQzYByHiC_G3s8tSRuH2JzOer5WKyVTucg5A7othBdabzVs6KHNN_89ivVUe_nbEQDfGCk_tksCTj6gXIF_Y/s320/Hoodie.jpg" width="271" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Also, here are progress reels for both my iAnimate Workshop 1 that I finished back in May, and Workshop 2, which I finished in August. Currently finishing off a dialog piece for Workshop 3, but that I'll post later, once it's actually done:)</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><br />
<div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="300" mozallowfullscreen="" src="http://player.vimeo.com/video/21544812?title=0&byline=0&portrait=0" webkitallowfullscreen="" width="400"></iframe></div><div style="text-align: center;"><br />
</div><div style="text-align: center;"><iframe allowfullscreen="" frameborder="0" height="300" mozallowfullscreen="" src="http://player.vimeo.com/video/26855408?title=0&byline=0&portrait=0" webkitallowfullscreen="" width="400"></iframe></div>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-5924197703514395482011-03-02T23:12:00.001+01:002011-11-27T03:34:53.636+01:00A small UpdateSo, once again, I've been silent for ages. I tend to read a lot of other people's blogs, but I seem to forget to actually do something about my own. Well here are a few new things that I did in the last while:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_01.jpg" width="212" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_04.jpg" width="193" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_05.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_03.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2011/03/Mar_02_2011_02.jpg" width="219" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Also, I have actually started on my way to animation! I have enrolled into the new school created by the one and only Jason Ryan, <a href="http://ianimate.net/">iAnimate.net</a>, and have been doing my Workshop 1 for the last 2 months. Here are a few things to show my progress. Hope you enjoy!</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><b><u>A Ball Bounce:</u></b></div><div style="text-align: center;"><iframe frameborder="0" height="300" src="http://player.vimeo.com/video/18717378" width="400"></iframe></div><div style="text-align: center;"><a href="http://vimeo.com/18717378">Ball Bounce on the Spot - WIP7</a> from <a href="http://vimeo.com/user2765446">Dimitry Kachkovski</a> on <a href="http://vimeo.com/">Vimeo</a>.</div><div style="text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><b><u>A slightly more fun ball bounce:</u></b></div><div style="text-align: center;"><iframe frameborder="0" height="300" src="http://player.vimeo.com/video/18765888" width="400"></iframe></div><div style="text-align: center;"><a href="http://vimeo.com/18765888">Ball Bounce Across the Screen - WIP14</a> from <a href="http://vimeo.com/user2765446">Dimitry Kachkovski</a> on <a href="http://vimeo.com/">Vimeo</a>.</div><div style="text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><b><u>Different Weights exercise:</u></b></div><div style="text-align: center;"><iframe frameborder="0" height="300" src="http://player.vimeo.com/video/19336908" width="400"></iframe></div><div style="text-align: center;"><a href="http://vimeo.com/19336908">A2-WIP7</a> from <a href="http://vimeo.com/user2765446">Dimitry Kachkovski</a> on <a href="http://vimeo.com/">Vimeo</a>.</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><b><u>TOTS (Thing On The Spring) Jump:</u></b></div><div style="text-align: center;"><iframe frameborder="0" height="300" src="http://player.vimeo.com/video/20147463" width="400"></iframe></div><div style="text-align: center;"><a href="http://vimeo.com/20147463">A3 - TOTs Jump - Final</a> from <a href="http://vimeo.com/user2765446">Dimitry Kachkovski</a> on <a href="http://vimeo.com/">Vimeo</a>.</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;">And this is the latest anim I am working on, so it is still a WIP:</div><div style="text-align: center;"><iframe frameborder="0" height="300" src="http://player.vimeo.com/video/20427898" width="400"></iframe></div><div style="text-align: center;"><a href="http://vimeo.com/20427898">A4-rev1</a> from <a href="http://vimeo.com/user2765446">Dimitry Kachkovski</a> on <a href="http://vimeo.com/">Vimeo</a>.</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;">That's it for now! Time to get more things going!</div>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com3tag:blogger.com,1999:blog-5843729944805509488.post-45766581568205377662011-02-09T01:21:00.000+01:002011-02-09T01:21:57.214+01:00In beautiful Vancouver, and just got my Wacom back!As a celebration for getting my Wacom Tablet back with all my other stuff from Germany, I decided to dedicate a little bit of time to the neglected child and did a small b/w painting study. Was definitely fun, and I am sure I will attempt to do the same thing again, but in color. Hope you enjoy!<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2011/02/Skull_WIP1.jpg" imageanchor="1" style=""><img border="0" height="480" width="477" src="http://www.dimitrykachkovski.com/wp-content/uploads/2011/02/Skull_WIP1.jpg" /></a></div>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-78706781069252647312011-01-20T18:09:00.000+01:002011-01-20T18:09:41.821+01:00Felipe Nogueira - Character TD ReelThought I should share the awesome work a buddy of mine, Felipe Nogueira, has done. Very, very impressive reel! Looking forward where this guy ends up being:)<br />
<iframe allowfullscreen="" class="youtube-player" frameborder="0" height="260" src="http://www.youtube.com/embed/JWqzkeEq48g" title="YouTube video player" type="text/html" width="426.6"></iframe>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-17768589764951085462010-11-05T10:25:00.000+01:002010-11-05T10:25:10.330+01:00Woohooo! I'm on a roll:)Ok, I gotta say, I am very much enjoying my time now. Not sure what happened, but it looks like I broke a new plateau when it comes to drawing. I know, I know, still a ton to learn, will always be, but hey, this is pretty damn cool! For the first time, in my life - no less, I can really see my own progress!<br />
<br />
So, cutting to the chase. Last night I decided that I need to do a facial study, to try and solidify my understanding of the face. I picked a random face and started working. My goal was to work from the inside out, meaning I was looking for skeleton landmarks that would create a solid proportion and structure, general head shape, then slowly but surely progressing into seeing how different facial muscles formed the face and caused certain forms of the face. Then I tried to get all those forms to work correctly.<br />
<br />
I cannot describe just HOW MUCH I learned. This is absolutely amazing! I really understood how much all of that anatomical structure can assist you while working, and how much is in fact going on. No kidding, I was shaking while doing this, cause I was so nervous to put too much pressure on the pencil. Which, btw, finally forced me to start light, and progress from larger to smaller. Basically, I am finally doing things as they have always been told to me to do:)<br />
<br />
Ok, I hope I didn't overhype this, as it isn't anything out of the ordinary, but hell, it deffinately is a landmark to how far I went so far. Time to complete - ~2.5 hrs.<br />
<br />
Enjoy!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_05_2010_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_05_2010_01.jpg" width="222" /></a></div>If you want to see a larger version, go <a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_05_2010_01_large.jpg"><u><b>HERE</b></u></a>.<br />
<br />
<br />
Till next time!<br />
<br />
DKDimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-7786782644948134052010-11-03T21:50:00.000+01:002010-11-03T21:50:00.513+01:00Long nights, but loving every bit of it!Been staying up quite a bit lately... Surprising part for myself is that the reason for it is me drawing! I feel exhilarated nearly every time I touch a pencil now (Should I be concerned?...)<br />
<br />
Anyway, so I've been going back to learning a bit more anatomy as well these days, going through Glen Vilppu's head anatomy videos. I know that I am still really confused with the cheek area and the depressors of the lips area. It is really useful, and if you don't know it, better get them ASAP. Some of the best anatomy instruction videos that exist.<br />
<br />
I didn't go all that nuts with drawing many heads (I will soon, however), but I did try my best at learning what Vilppu was explaining, and at the end of it all I did a head drawing from imagination, trying to remember all that I just learned. Can't say I feel succesful, but I do believe I learned something along the way...<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_02.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_01.jpg" width="320" /></a></div><br />
And here is another little brain fart:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="309" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_03.jpg" width="320" /></a></div><br />
I have also not posted my lifedrawing from last week, i believe. As I had a session today as well, here is what I ended up outputting. Sometimes I hope the Pencil Gods will forgive my infinite sins... Because honestly, I fear that these sketches must be pissing the off a whole lot!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_09.jpg" width="222" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_08.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_08.jpg" width="182" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_04.jpg" width="168" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_05.jpg" width="211" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_06.jpg" width="203" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_07.jpg" width="286" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_10.jpg" width="225" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_11.jpg" width="163" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_12.jpg" width="266" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_13.jpg" width="170" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="249" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_14.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_15.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/11/Nov_03_2010_16.jpg" width="320" /></a></div>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com1tag:blogger.com,1999:blog-5843729944805509488.post-53500960000443802862010-10-27T17:37:00.000+02:002010-10-27T17:37:02.975+02:00Halloween Card WIPPen sketch:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_27_2010_03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_27_2010_03.jpg" width="223" /></a></div> Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-5506008903051937002010-10-27T15:41:00.000+02:002010-10-27T15:41:39.408+02:00Tiny midnight sketchesSat last night, and being inspired by <a href="http://pixelherding.blogspot.com/">Aidan's</a> work I decided to do a tiny lil test with watercolors. It sucks, very much, but hey, it is better then nothing! Now to get more confidence... Ah, and after seeing all the weird stuff he has on his blog, I sketched a lil creature which I might take further in PS or maybe also in WaterColors.<br />
<br />
<div class="separator" style="clear: both; text-align: left;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_27_2010_02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_27_2010_02.jpg" width="171" /></a><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_27_2010_01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_27_2010_01.jpg" width="171" /></a></div>Dimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0tag:blogger.com,1999:blog-5843729944805509488.post-83957385236817052212010-10-26T15:19:00.000+02:002010-10-26T15:19:59.566+02:00Attempts at pinups and a large sketch dumpLike I promised the last time, I have gotten a bunch of sketches from some life-drawing sessions. As well, I have gotten into my head to do a sort of "Pin up" girl drawing. And I ended up with a drawing which I actually made entirely out of my head referencing only the anatomy to more or less correctly know where to place the masses. Here is the drawing:<br />
<span id="goog_1200235770"></span><span id="goog_1200235771"></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_04.jpg" width="152" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_04_sketch.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div>I have done it in a blue Caran d' Ache pencil, which, tbh, is turning out to be one of my favourite weapons of choice! I really like how I can be quite soft with it, and whenever I do the lines, I end up making quite cool flowing results which I enjoy so much. This whole thing took me about 2-3 hours, which is quite a bit. Here is a sketch that started the idea:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_04_sketch.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_04_sketch.jpg" width="150" /></a></div><br />
<br />
<br />
<br />
This was just a quick pen doodle I did trying to figure out what the pose should be. I redrew the final from scratch, following the way Clair Wendling mentioned that she draws, allowing me for more practice. I also did another attempt before that, but I ended up partially referencing the pose from a model picture, which I cannot say was what I wanted. Here it is:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_18.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_18.jpg" width="320" /></a></div>I tried to play around with proportions, but I gotta be honest, I am not a fan of how it turned out. She got a bit too curvy for the way I pictured it, and I feel I didn't capture what I wanted to get out of the pose. I might come back to it, but I will need to think of some more additions to the design. I really like the old-school pinup drawings, such as those done by <a href="http://www.gilelvgren.com/GE/">Gil Elvgren:</a><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.gilelvgren.com/GE/imagesDB/Elvgren_NoYouDont_1956_30x24_oiloncanvas.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://www.gilelvgren.com/GE/imagesDB/Elvgren_NoYouDont_1956_30x24_oiloncanvas.jpg" width="163" /></a></div><a href="http://www.gilelvgren.com/GE/imagesDB/elvgrenCoolingOff.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://www.gilelvgren.com/GE/imagesDB/elvgrenCoolingOff.jpg" width="154" /></a><br />
<div class="separator" style="clear: both; text-align: left;"><br />
I like the fun in these drawings. I always wanted to do 1 or 2 of such pinups, but maybe with my own twist. </div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">What makes these interesting to me (beside being a guy, i guess:) is that unlike so many other drawings that are done now days, these aren't of women with some unbelievable proportions (think <a href="http://en.wikipedia.org/wiki/J._Scott_Campbell">J Scott Campbell</a> girls, which, in my opinion, tend to get really annoying now days), but rather of natural looking women, someone real, alive. The Marvel style stuff, however "cool" it might be in the nerdy/guy sense of thinking, feels like plastic dolls and to me, and borders on the feeling of cartoon porn rather then interesting and tasteful art. And these old-school pinups are a lot more intricate in the way they display the idea. But I guess that is just what was found interesting back then, the "Marvel" girls of those times... But hey, at least they do not make women look like they should stuff themselves with silicone and stop eating to look beautiful!</div><div class="separator" style="clear: both; text-align: left;"><br />
</div>In any case, the best part is that while doing that drawing I really came to learn a ton about anatomy. And boy did I ever had fun drawing! This is probably one of the more finished works I have done so far, albeit without a background, but that will at some point change. I am also thinking of trying my hand with some watercolors next time. I will try a couple of drawings straight on the watercolor paper, and see what I can come up with. Probably will be a disaster, but her, what the heck!<br />
<br />
Aaaaaaaaanyway, here is the rest of the stuff I sketched from the last month or so that I missed putting up here: <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_02.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_03.jpg" width="251" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="171" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_05.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_06.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_07.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_08.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_08.jpg" width="220" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_09.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_10.jpg" width="167" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_11.jpg" width="291" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_12.jpg" width="225" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_13.jpg" width="225" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="139" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_14.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_15.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_15.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_17.jpg" width="277" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://www.dimitrykachkovski.com/wp-content/uploads/2010/10/Oct_26_16.jpg" width="144" /></a></div><br />
Till next time!!!<br />
<br />
-DKDimitry Kachkovskihttp://www.blogger.com/profile/13954483539586993960noreply@blogger.com0