Is it possible using QGIS or GRASS to perform a Zone of Visual Impact assessment? E.g. where can a 100m high structure be seen at a viewing height of 1.8m within 30km, taking into account elevation (also maybe buildings and wooded areas)? I'm pretty new to GIS but am having to learn pretty quickly for work. Any help would be much appreciated.
Yes is the short answer. You can do this in GRASS using r.viewshed.
However, it sounds very much like you are doing some Windfarm ZTV (Zones of Theoretical Visibility) analysis. If that is correct, you could also try OpenWind. This is an excellent and free utility and may be right up your street. It doesn't have the full-on capabilities of the big three proprietary wind farm analysis packages, viz: WindFarmer (by Garrad Hassan), WindFarm (ReSoft) or WindPro(EMD). However, it does an excellent job for the most common tasks (including calculating a ZTV).
For buildings and woodland, you will have to get or estimate the heights and then much will depend on the exact system you are using. Some will account for vector obstructions, but if not, you can edit your DTM by adding the heights of the buildings and trees (be careful with your raster resolution though - so you don't over estimate the area of the obstruction inadvertently).
Finally, you may want to reconsider your view height of 1.8m. 1.8m represents an average man's height... to the top of their head. The eyes are a bit lower than that! I always use 1.5m as a more representative adult eye-height unless a client absolutely insists or when required to conform to specific planning guidance. It probably won't make much difference given the likely resolution of your DTM and the distances involved, but you can claim greater realism :)
I'm assuming what you're after as a viewshed analysis tool. Check the wikipedia page for a brief introduction.
As far as i'm aware QGIS doesn't have this built in however there is a plugin available at http://pyqgis.org/repo/contributed . Not sure if this tool works with vector data however, but i suppose you could always do a conversion.
Similarly for GRASS there is a plugin available called r.viewshed ( http://grass.osgeo.org/wiki/GRASS_AddOns#r.viewshed ) that should be able to perform this task, however i believe it is only for raster data.
I can't vouch for either tool but hopefully this should point you in the right direction.