首页 > > 详细

COMP3170 Assignment 3 Moonlit forest

 COMP3170 Assignment 3

Moonlit forest
Objectives
This assignment covers the following topics:
• 3D modelling with triangular meshes
• 3D Transformations
• Perspective cameras
• Fragment shaders
• Illumination and shading
• Texturing
This is a two-person group assignment. Your task is to build a simple 3D scene of a snowy 
forest in the moonlight, like this:
Framework
A basic framework for the assignment is available via the GitHub classroom link on iLearn.
Scene features
Your mark will be based on the features you implement, from the list below. Each feature 
has a mark value attached. Completing more than 100% worth of features will not earn 
additional marks. Details below. The more challenging elements are marked with an 
asterisk*.
Feature Marks
Forest meshes
• Tree trunk
• Tree canopy
• 40 random trees
5%
5%
5%
Textures
• Snow on the ground plane
• Tree trunks
• Tree canopy
• Colour
• Cone UVs calculated in shader*
5%
5%
5%
5%
4%
Camera
• Perspective camera with appropriate view volume
• Aspect matches window
• Movement with keyboard controls
5%
5%
4%
Moon
• Mesh
• Rotates around world
• Always at back of scene (implemented in shader)*
4%
4%
4%
Illumination
• Directional light based on moon position
• Moon light fades to zero as it drops below the horizon
• Secondary point light at player (torch)
• Torch intensity drops off with distance
• Player torch direction controlled with mouse*
4%
4%
4%
4%
4%
Shading
• Ambient and diffuse lighting on ground
• Specular lighting on ground
• Ambient and diffuse light on trunk and canopy
• Canopy fragment normals calculated in shader*
4%
4%
4%
4%
Total 100%
General requirements
Your scene should be implemented using:
1) Anti-aliasing using 2x2 supersampling.
2) Backface culling
3) Mipmaps for all textures (with trilinear filtering)
4) Gamma correction (with a default gamma of 2.2)
Correctness marks will be deducted if these not implemented correctly.
Forest meshes
• The forest should consist of a 40x40m ground plane, as a flat square (provided in 
framework).
• 40 trees should be randomly distributed on the ground plane
• Each tree is made of two parts:
o A cylindrical trunk
o A conical canopy of leaves
• Each tree should be between 5m and 10m tall, with random variations in both trunk
and canopy heights and radii.
Textures
The ground plane should be textured using the snow.png texture provided.
• The texture should repeat 20 times across the square in each direction.
The tree trunk and canopy should be textured using the tree.png texture provided.
• The texture should repeat two times horizontally and vertically around the trunk.
• The texture should repeat four times horizontally and three times vertically around 
the canopy.
• This texture provided is greyscale. Colouring should be implemented in the shader, 
so the canopy is green and the trunk is brown.
• Note: Calculating texture coordinates for a cone is more difficult than usual. The 
standard technique of setting vertex UVs and interpolating them doesn’t give good 
results. So, you will need to write a purpose shader to calculate UVs for the canopy. 
The method involved will be discussed in tutorials.
Camera
• The camera should have a perspective projection with an appropriate vertical field 
of view.
• The near and far planes of the camera should be set so the player can see the full 
extent of the landscape from any position without any obvious culling. However, the 
view volume should also not be excessively large.
• The aspect ratio of the camera should match the aspect ratio of the window, so the 
view does not distort when the window is resized.
• The camera should sit 1.5m above the terrain.
• The camera should move with the keys:
o W/S moves forwards and backwards
o Q/E strafes left and right
o A/D turns left and right
• There is no need to handle colliding with trees or walking beyond the extent of the 
world.
The Moon
• The moon is a white sphere.
• The moon should rise and fall, rotating around the world once every 2 minutes.
• The moon should always render behind other objects in the scene. This should be 
implemented in the fragment shader by adjusting the depth values for fragments.
Illumination
• There should be a very low level of ambient lighting.
• The Moon should be a source of directional lighting, based on its position in the sky.
• When the moon is below the horizon, its intensity should fade to zero.
• There should be a secondary point light source at the player’s position, representing 
a torch held by the player. It should have a yellowish colour. Pressing space turns the 
torch off and on.
• The intensity 𝐼 of the torch should fall off with distance 𝑑 using the equation: 
𝐼 =
𝐼𝑚𝑎𝑥
𝑑
• The torch light should only have effect within a cone with an angle of 30° centred on 
the mouse position.
Shading
• All lighting should be implemented as fragment lighting (i.e. based on fragment 
normals).
• The ground should implement ambient, diffuse and specular lighting (with a low 
specularity) so the snow appears brighter when facing toward the moon.
• The tree canopy and trunk should implement ambient and diffuse lighting, with 
appropriate normals.
• Note: computing normals for a cone by interpolating vertex normals will not yield 
accurate results. To shade the tree canopy, you will need to calculate normals 
directly in the fragment shader, based on the model coordinates of the fragment.
Documentation
In addition to your code, you should submit a PDF report following the Word template 
provided. The report should include:
• A completed table indicating the features you have attempted.
• An illustration of the scene graph used in your game.
• Illustrations of all the meshes used in your game, including:
o the origin
o the x, y, z axes
o the coordinates of each vertex in model coordinates
o the triangles that make the mesh
• Diagrams illustrating the lighting calculations, including:
o Diffuse lighting from the moon
o Specular lighting from the moon
o Diffuse lighting from the torch
o Specular lighting from the torch
o Calculation of the intensity and cone shape for the torch
Submission
Your Java project will be submitted using Github Classroom. Your most recent commit to 
the repository before the assignment deadline will be marked. 
Your report will be submitted using iLearn as a PDF.
No late submissions will be accepted, except in the case of special consideration (which 
requires a formal application). Last minute problems with Git are not an excuse for late 
submission. Remember to commit and push your work regularly as you go.
Peer assessment
You will also submit individual peer assessment reports, using the template provided on 
iLearn, to assess both your own contribution and that of your teammate. You need to 
provide a grade (following the rubric given in the template) and a justification for the grade. 
This grade will be kept private from your teammate but will be used as evidence to adjust 
the final individual grade weighting
Marks
Your marks will be calculated using three components (according to the rubric below):
• Correctness: Whether your code is correctly implemented.
• Clarity: Whether your code is easy to understand.
• Documentation: Whether your report contains all the required elements.
This mark will be scaled based on a Completeness mark, which refers to the total value of 
the components you have attempted. Each component is worth between 5% and 10%, as 
detailed in the Report Template. 
Your final group mark will be determined using the formula:
SQRT(Completeness * (60% * Correctness + 20% * Clarity + 20% * Documentation))
So, for example if you attempt 80% of the features above, with perfect correctness (100%), 
slightly sloppy code (70%) and some minor sloppiness in the document (80%), your final 
mark would be: 
SQRT(80% * (60% * 100% + 20% * 70% + 20% * 80%)) 
= SQRT(80% * (60% + 14% + 16%)
= SQRT(80% * 90%) 
= 84.9%
On the other hand, if you only attempt 50% of the features above, to the same level of 
quality (90%) your final mark would be: 
SQRT(50% * 90%) = 67.1%
Individual marks will be assigned based on peer assessment and evidence of contribution 
(e.g. commits in the GitHub repo). Generally, your individual mark will be equal to your 
group mark unless there is evidence of a substantial disparity in the amount of work 
performed by each group member.
Rubric
Grade Correctness Clarity Documentation
 
联系我们 - QQ: 99515681 微信:codinghelp
程序辅导网!